@nextcommerce/campaigns-os 1.48.0 → 1.52.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 (80) hide show
  1. package/CHANGELOG.md +539 -0
  2. package/agents/claude/CLAUDE.md +6 -5
  3. package/agents/codex/AGENTS.md +6 -5
  4. package/agents/copilot/copilot-instructions.md +3 -3
  5. package/agents/cursor/campaigns-os.mdc +3 -3
  6. package/campaign-spec/dist/rules/campaign-metadata.d.ts +5 -1
  7. package/campaign-spec/dist/rules/campaign-metadata.js +9 -2
  8. package/campaign-spec/dist/rules/design-source-shape.js +13 -3
  9. package/campaign-spec/dist/rules/sdk-version.js +2 -1
  10. package/compatibility.json +1 -1
  11. package/contracts/commerce-surface-catalog.json +26 -46
  12. package/contracts/effects.v1.json +254 -2
  13. package/contracts/release-ledger.json +1239 -0
  14. package/contracts/supported-surface.json +4 -4
  15. package/contracts/template-brand-contract.shared-commerce.v0.json +2 -2
  16. package/contracts/template-slot-manifest.shared-content-core.v0.json +24 -0
  17. package/docs/brand-theme-bridge.md +12 -6
  18. package/docs/build-packet.md +101 -12
  19. package/docs/campaign-build-brief.md +25 -1
  20. package/docs/effects.md +6 -0
  21. package/docs/local-setup.md +1 -1
  22. package/docs/orientation-contract-reference.md +1 -1
  23. package/docs/polish-evidence.md +10 -0
  24. package/docs/qa-and-test-orders.md +66 -11
  25. package/docs/runtime-readiness.md +1 -1
  26. package/docs/sdk-storage-compatibility.md +1 -1
  27. package/docs/skills-revision.md +10 -10
  28. package/package.json +1 -1
  29. package/schemas/campaign-runtime-build-packet.v0.schema.json +4 -0
  30. package/schemas/campaigns-os-qa-verdict.v0.schema.json +8 -3
  31. package/skills/campaign-lifecycle-orientation/SKILL.md +3 -3
  32. package/skills/campaign-readback-classification/SKILL.md +3 -3
  33. package/skills/campaign-run-evidence/SKILL.md +3 -3
  34. package/skills/contribution-intake/SKILL.md +3 -3
  35. package/skills/next-campaigns-build/SKILL.md +4 -4
  36. package/skills/next-campaigns-os/SKILL.md +4 -4
  37. package/skills/next-campaigns-os/references/session-intake.md +7 -3
  38. package/skills/next-campaigns-os-setup/SKILL.md +3 -3
  39. package/skills/next-campaigns-polish/SKILL.md +5 -4
  40. package/skills/next-campaigns-qa/SKILL.md +6 -5
  41. package/skills.json +10 -10
  42. package/src/adapter-decision-contract.mjs +1 -1
  43. package/src/brand-theme.mjs +25 -2
  44. package/src/build-brief.mjs +68 -21
  45. package/src/built-site-scope.mjs +39 -6
  46. package/src/built-smoke-qc.mjs +1117 -0
  47. package/src/campaign-identity.mjs +36 -2
  48. package/src/cart-placeholders.mjs +730 -0
  49. package/src/cli.mjs +320 -42
  50. package/src/commercial-journey.mjs +65 -4
  51. package/src/commercial-parity.mjs +6 -1
  52. package/src/doctor/checks.mjs +291 -24
  53. package/src/doctor/inspect.mjs +53 -2
  54. package/src/doctor/next-step.mjs +1 -1
  55. package/src/install-mode.mjs +0 -8
  56. package/src/invocation.mjs +5 -2
  57. package/src/local-preview-policy.mjs +1 -1
  58. package/src/local-proof.mjs +4 -1
  59. package/src/polish-browser.mjs +218 -1
  60. package/src/polish-capture.mjs +1 -1
  61. package/src/polish-media-weight.mjs +492 -0
  62. package/src/polish-node.mjs +96 -4
  63. package/src/progress-node.mjs +5 -1
  64. package/src/qa-binding-evidence.mjs +21 -0
  65. package/src/qa-browser.mjs +338 -97
  66. package/src/qa-content-params.mjs +889 -0
  67. package/src/qa-node.mjs +114 -14
  68. package/src/qa-order-bump.mjs +22 -1
  69. package/src/qa-policy-links.mjs +1019 -0
  70. package/src/qa-tracking-params.mjs +1389 -0
  71. package/src/qa-url-privacy.mjs +168 -0
  72. package/src/qc-accept.mjs +446 -0
  73. package/src/qc-check-registry.mjs +83 -0
  74. package/src/qc-results.mjs +1049 -0
  75. package/src/sdk-attribute-index.mjs +71 -0
  76. package/src/sdk-markup.mjs +2 -2
  77. package/src/sdk-storage-compatibility.mjs +63 -3
  78. package/src/source-prep.mjs +37 -7
  79. package/src/stage-record.mjs +356 -36
  80. package/src/theme-gate.mjs +3 -3
@@ -4631,6 +4631,1245 @@
4631
4631
  }
4632
4632
  ],
4633
4633
  "entry_sha256": "abc8749936f439d33b92b3bfdc1c954d0b38df24e5a80a2e3862123494b47f07"
4634
+ },
4635
+ {
4636
+ "id": "RL-0208",
4637
+ "sequence": 200,
4638
+ "date": "2026-10-02",
4639
+ "kind": "release",
4640
+ "surface_version": "1.49.0",
4641
+ "changelog_section": "1.49.0",
4642
+ "changelog_sha256": "89c063cc2229b29d161820612d3724a7daecc03c3d1531c0046b503941bd0667",
4643
+ "agent_impact": "Surface 1.49.0. Record an applied brand layer with campaigns-os record theme --packet <p> after record build, instead of editing report.theme by hand: it reads each built commerce page's stylesheet links, requires brand-theme.css (or checkout-brand.css) after next-core.css on every page that loads next-core.css, and writes report.theme (status applied, load_order after-next-core, css_path, commerce_pages, evidence), clearing any earlier theme waiver. Record a local preview with campaigns-os record deploy --packet <p> --base-url <url> after record polish, instead of editing deploy.preview_url and stages.deploy by hand: the URL must be a loopback origin naming the campaign's route root, every built page under it must answer 2xx, and it writes the packet's deploy.preview_url and stages.deploy completed. Both are refused, writing nothing, otherwise. The Build Packet schema now accepts the template families apollo, apollo-mv-single-step, arjuna and karna, so a packet on those families validates. Bundled skills carry revision 1.49.0+skills.1: an agent that loaded 1.48.0+skills.1 should start a fresh session. Install the 1.49.0 package with the documented local setup command.",
4644
+ "compatibility": "additive",
4645
+ "migration": "none",
4646
+ "changes": [
4647
+ {
4648
+ "class": "compatibility_policy",
4649
+ "path": "compatibility.json",
4650
+ "surface_entry": null,
4651
+ "summary": "Name the package version (1.49.0)."
4652
+ },
4653
+ {
4654
+ "class": "compatibility_policy",
4655
+ "path": "contracts/effects.v1.json",
4656
+ "surface_entry": "contracts/effects.v1.json",
4657
+ "summary": "Declare record theme (writes the Assembly Report) and record deploy (writes the Build Packet and the Assembly Report, and requests each built page on the loopback --base-url), each with its --dry-run form, and the doctor sidecar stamp when one is retained."
4658
+ },
4659
+ {
4660
+ "class": "compatibility_policy",
4661
+ "path": "contracts/supported-surface.json",
4662
+ "surface_entry": "contracts/supported-surface.json",
4663
+ "summary": "Advance the supported surface to 1.49.0 and record the effects contract and Build Packet schema hashes."
4664
+ },
4665
+ {
4666
+ "class": "named_surface",
4667
+ "path": "docs/brand-theme-bridge.md",
4668
+ "surface_entry": "docs/brand-theme-bridge.md",
4669
+ "summary": "Record an applied brand layer with record theme, which writes commerce_pages from the built pages that load next-core.css."
4670
+ },
4671
+ {
4672
+ "class": "named_surface",
4673
+ "path": "docs/build-packet.md",
4674
+ "surface_entry": "docs/build-packet.md",
4675
+ "summary": "Add record theme and record deploy to the record command table, name record theme in the starter-palette lane, and name record deploy where the local-serve URL is recorded."
4676
+ },
4677
+ {
4678
+ "class": "named_surface",
4679
+ "path": "docs/qa-and-test-orders.md",
4680
+ "surface_entry": "docs/qa-and-test-orders.md",
4681
+ "summary": "In the local proof sequence, record the served URL with record deploy once polish is recorded."
4682
+ },
4683
+ {
4684
+ "class": "named_surface",
4685
+ "path": "docs/local-setup.md",
4686
+ "surface_entry": "docs/local-setup.md",
4687
+ "summary": "Pin the local setup install command to the 1.49.0 package."
4688
+ },
4689
+ {
4690
+ "class": "documentation",
4691
+ "path": "docs/orientation-contract-reference.md",
4692
+ "surface_entry": "docs/orientation-contract-reference.md",
4693
+ "summary": "Regenerate the orientation reference for surface 1.49.0."
4694
+ },
4695
+ {
4696
+ "class": "named_surface",
4697
+ "path": "docs/runtime-readiness.md",
4698
+ "surface_entry": "docs/runtime-readiness.md",
4699
+ "summary": "Regenerate the runtime readiness reference for surface 1.49.0."
4700
+ },
4701
+ {
4702
+ "class": "named_surface",
4703
+ "path": "docs/skills-revision.md",
4704
+ "surface_entry": "docs/skills-revision.md",
4705
+ "summary": "Use the current 1.49.0+skills.1 bundle in executable examples."
4706
+ },
4707
+ {
4708
+ "class": "generated_runtime",
4709
+ "path": "package-lock.json",
4710
+ "surface_entry": null,
4711
+ "summary": "Update release metadata for 1.49.0."
4712
+ },
4713
+ {
4714
+ "class": "package_export",
4715
+ "path": "package.json",
4716
+ "surface_entry": null,
4717
+ "summary": "Release 1.49.0."
4718
+ },
4719
+ {
4720
+ "class": "schema",
4721
+ "path": "schemas/campaign-runtime-build-packet.v0.schema.json",
4722
+ "surface_entry": "schemas/campaign-runtime-build-packet.v0.schema.json",
4723
+ "summary": "assembly.template_family accepts apollo, apollo-mv-single-step, arjuna and karna, every family the catalog and the private template sources name; nothing is removed."
4724
+ },
4725
+ {
4726
+ "class": "skill",
4727
+ "path": "skills.json",
4728
+ "surface_entry": "skills.json",
4729
+ "summary": "Advance the bundled skill revision to 1.49.0+skills.1 and each skill version one patch."
4730
+ },
4731
+ {
4732
+ "class": "skill",
4733
+ "path": "skills/campaign-lifecycle-orientation/SKILL.md",
4734
+ "surface_entry": null,
4735
+ "summary": "Publish the 1.49.0+skills.1 bundle revision."
4736
+ },
4737
+ {
4738
+ "class": "skill",
4739
+ "path": "skills/campaign-readback-classification/SKILL.md",
4740
+ "surface_entry": null,
4741
+ "summary": "Publish the 1.49.0+skills.1 bundle revision."
4742
+ },
4743
+ {
4744
+ "class": "skill",
4745
+ "path": "skills/campaign-run-evidence/SKILL.md",
4746
+ "surface_entry": null,
4747
+ "summary": "Publish the 1.49.0+skills.1 bundle revision."
4748
+ },
4749
+ {
4750
+ "class": "skill",
4751
+ "path": "skills/contribution-intake/SKILL.md",
4752
+ "surface_entry": null,
4753
+ "summary": "Publish the 1.49.0+skills.1 bundle revision."
4754
+ },
4755
+ {
4756
+ "class": "skill",
4757
+ "path": "skills/next-campaigns-build/SKILL.md",
4758
+ "surface_entry": null,
4759
+ "summary": "Run record theme after record build when a brand theme is applied, instead of editing report.theme; publish the 1.49.0+skills.1 bundle revision."
4760
+ },
4761
+ {
4762
+ "class": "skill",
4763
+ "path": "skills/next-campaigns-os-setup/SKILL.md",
4764
+ "surface_entry": null,
4765
+ "summary": "Publish the 1.49.0+skills.1 bundle revision."
4766
+ },
4767
+ {
4768
+ "class": "skill",
4769
+ "path": "skills/next-campaigns-os/SKILL.md",
4770
+ "surface_entry": null,
4771
+ "summary": "Publish the 1.49.0+skills.1 bundle revision."
4772
+ },
4773
+ {
4774
+ "class": "skill",
4775
+ "path": "skills/next-campaigns-polish/SKILL.md",
4776
+ "surface_entry": null,
4777
+ "summary": "Name record build and record theme in the theme gate's apply lane; publish the 1.49.0+skills.1 bundle revision."
4778
+ },
4779
+ {
4780
+ "class": "skill",
4781
+ "path": "skills/next-campaigns-qa/SKILL.md",
4782
+ "surface_entry": null,
4783
+ "summary": "Publish the 1.49.0+skills.1 bundle revision."
4784
+ },
4785
+ {
4786
+ "class": "cli_surface",
4787
+ "path": "src/cli.mjs",
4788
+ "surface_entry": "record",
4789
+ "summary": "Add record theme and record deploy to the usage text; name record theme in the build prompt and starter-palette notice, and record deploy in next's local-serve deploy action and the deploy prompt."
4790
+ }
4791
+ ],
4792
+ "entry_sha256": "044cecbdb3e7b2bf182ec907320d8beb45361095df4a1df1ec6a119639f1b28d"
4793
+ },
4794
+ {
4795
+ "id": "RL-0209",
4796
+ "sequence": 201,
4797
+ "date": "2026-10-02",
4798
+ "kind": "release",
4799
+ "surface_version": null,
4800
+ "changelog_section": "1.49.0+agent.1",
4801
+ "changelog_sha256": "b2b72f1759ab5a42e177b386aa70d7fbd56a1e2730d5143cf91b14d0f3e3c0ab",
4802
+ "agent_impact": "Run toolkit commands from the campaign folder as npx --no-install campaigns-os …, as the agent context now spells them; a bare campaigns-os resolves through PATH to another copy or to nothing. Reproduce the source design's own proof and urgency elements as designed; do not remove, soften or flag them. An installed agent context keeps the old text until install-agent-context refreshes it.",
4803
+ "compatibility": "compatible",
4804
+ "migration": "none",
4805
+ "changes": [
4806
+ {
4807
+ "class": "documentation",
4808
+ "path": "agents/claude/CLAUDE.md",
4809
+ "surface_entry": "agents/claude/CLAUDE.md",
4810
+ "summary": "Spell every toolkit command npx --no-install campaigns-os, and carry the build skill's rule to reproduce the source design's proof and urgency elements without removing, softening or flagging them."
4811
+ },
4812
+ {
4813
+ "class": "documentation",
4814
+ "path": "agents/codex/AGENTS.md",
4815
+ "surface_entry": "agents/codex/AGENTS.md",
4816
+ "summary": "Spell every toolkit command npx --no-install campaigns-os, and carry the build skill's rule to reproduce the source design's proof and urgency elements without removing, softening or flagging them."
4817
+ },
4818
+ {
4819
+ "class": "documentation",
4820
+ "path": "agents/copilot/copilot-instructions.md",
4821
+ "surface_entry": "agents/copilot/copilot-instructions.md",
4822
+ "summary": "Spell every toolkit command npx --no-install campaigns-os, and carry the build skill's rule to reproduce the source design's proof and urgency elements without removing, softening or flagging them."
4823
+ },
4824
+ {
4825
+ "class": "documentation",
4826
+ "path": "agents/cursor/campaigns-os.mdc",
4827
+ "surface_entry": "agents/cursor/campaigns-os.mdc",
4828
+ "summary": "Spell every toolkit command npx --no-install campaigns-os, and carry the build skill's rule to reproduce the source design's proof and urgency elements without removing, softening or flagging them."
4829
+ }
4830
+ ],
4831
+ "entry_sha256": "11f7c4b1771dc24155cc03b92f942a115b834de9528e12da51bd9d7b73fb3572"
4832
+ },
4833
+ {
4834
+ "id": "RL-0210",
4835
+ "sequence": 202,
4836
+ "date": "2026-10-02",
4837
+ "kind": "release",
4838
+ "surface_version": "1.50.0",
4839
+ "changelog_section": "1.50.0",
4840
+ "changelog_sha256": "dd65c5d7f65efddf1366ea3f1220660d98918bdd558dd18757b61a5152553b23",
4841
+ "agent_impact": "Surface 1.50.0. With qa run --browser, page-binding:<page_id> compares the key the Campaign Cart SDK sent on its Campaigns API requests with the expected key (evidence observation sdk_request, source kind sdk_request): match passes and mismatch is a blocker; the key is never recorded. A page that sends no Campaigns API request, a run with no single expected key, and qa run without --browser keep the static declaration read. A verdict consumer must accept observation sdk_request and source kind sdk_request in page-binding evidence. Ships 1.49.0+agent.1 (the agent context spells npx --no-install campaigns-os and carries the build skill's proof rule) and 1.49.0+agent.2 (a comment-only change). Bundled skills carry revision 1.50.0+skills.1 with unchanged text: an agent that loaded an earlier revision should start a fresh session. Install the 1.50.0 package with the documented local setup command.",
4842
+ "compatibility": "additive",
4843
+ "migration": "none",
4844
+ "changes": [
4845
+ {
4846
+ "class": "compatibility_policy",
4847
+ "path": "compatibility.json",
4848
+ "surface_entry": null,
4849
+ "summary": "Advance the declared version to 1.50.0."
4850
+ },
4851
+ {
4852
+ "class": "compatibility_policy",
4853
+ "path": "contracts/supported-surface.json",
4854
+ "surface_entry": "contracts/supported-surface.json",
4855
+ "summary": "Advance surface_version to 1.50.0 and record the QA verdict schema hash."
4856
+ },
4857
+ {
4858
+ "class": "named_surface",
4859
+ "path": "docs/local-setup.md",
4860
+ "surface_entry": "docs/local-setup.md",
4861
+ "summary": "Pin the 1.50.0 package in the local setup install command."
4862
+ },
4863
+ {
4864
+ "class": "documentation",
4865
+ "path": "docs/orientation-contract-reference.md",
4866
+ "surface_entry": "docs/orientation-contract-reference.md",
4867
+ "summary": "Regenerate at surface 1.50.0."
4868
+ },
4869
+ {
4870
+ "class": "named_surface",
4871
+ "path": "docs/qa-and-test-orders.md",
4872
+ "surface_entry": "docs/qa-and-test-orders.md",
4873
+ "summary": "Describe the browser pass's sdk_request page-binding observation and when the static read still applies."
4874
+ },
4875
+ {
4876
+ "class": "named_surface",
4877
+ "path": "docs/runtime-readiness.md",
4878
+ "surface_entry": "docs/runtime-readiness.md",
4879
+ "summary": "Regenerate at surface 1.50.0."
4880
+ },
4881
+ {
4882
+ "class": "named_surface",
4883
+ "path": "docs/skills-revision.md",
4884
+ "surface_entry": "docs/skills-revision.md",
4885
+ "summary": "Use the current 1.50.0+skills.1 bundle in executable examples."
4886
+ },
4887
+ {
4888
+ "class": "generated_runtime",
4889
+ "path": "package-lock.json",
4890
+ "surface_entry": null,
4891
+ "summary": "Advance the package version to 1.50.0."
4892
+ },
4893
+ {
4894
+ "class": "package_export",
4895
+ "path": "package.json",
4896
+ "surface_entry": null,
4897
+ "summary": "Advance the package version to 1.50.0."
4898
+ },
4899
+ {
4900
+ "class": "schema",
4901
+ "path": "schemas/campaigns-os-qa-verdict.v0.schema.json",
4902
+ "surface_entry": "schemas/campaigns-os-qa-verdict.v0.schema.json",
4903
+ "summary": "Accept observation sdk_request and the sdk_request source kind in page-binding evidence."
4904
+ },
4905
+ {
4906
+ "class": "skill",
4907
+ "path": "skills.json",
4908
+ "surface_entry": "skills.json",
4909
+ "summary": "Advance the bundled skill revision to 1.50.0+skills.1 and each skill version one patch."
4910
+ },
4911
+ {
4912
+ "class": "skill",
4913
+ "path": "skills/next-campaigns-os/SKILL.md",
4914
+ "surface_entry": null,
4915
+ "summary": "Publish the 1.50.0+skills.1 bundle revision."
4916
+ },
4917
+ {
4918
+ "class": "skill",
4919
+ "path": "skills/next-campaigns-os-setup/SKILL.md",
4920
+ "surface_entry": null,
4921
+ "summary": "Publish the 1.50.0+skills.1 bundle revision."
4922
+ },
4923
+ {
4924
+ "class": "skill",
4925
+ "path": "skills/next-campaigns-build/SKILL.md",
4926
+ "surface_entry": null,
4927
+ "summary": "Publish the 1.50.0+skills.1 bundle revision."
4928
+ },
4929
+ {
4930
+ "class": "skill",
4931
+ "path": "skills/next-campaigns-polish/SKILL.md",
4932
+ "surface_entry": null,
4933
+ "summary": "Publish the 1.50.0+skills.1 bundle revision."
4934
+ },
4935
+ {
4936
+ "class": "skill",
4937
+ "path": "skills/next-campaigns-qa/SKILL.md",
4938
+ "surface_entry": null,
4939
+ "summary": "Publish the 1.50.0+skills.1 bundle revision."
4940
+ },
4941
+ {
4942
+ "class": "skill",
4943
+ "path": "skills/campaign-lifecycle-orientation/SKILL.md",
4944
+ "surface_entry": null,
4945
+ "summary": "Publish the 1.50.0+skills.1 bundle revision."
4946
+ },
4947
+ {
4948
+ "class": "skill",
4949
+ "path": "skills/campaign-run-evidence/SKILL.md",
4950
+ "surface_entry": null,
4951
+ "summary": "Publish the 1.50.0+skills.1 bundle revision."
4952
+ },
4953
+ {
4954
+ "class": "skill",
4955
+ "path": "skills/campaign-readback-classification/SKILL.md",
4956
+ "surface_entry": null,
4957
+ "summary": "Publish the 1.50.0+skills.1 bundle revision."
4958
+ },
4959
+ {
4960
+ "class": "skill",
4961
+ "path": "skills/contribution-intake/SKILL.md",
4962
+ "surface_entry": null,
4963
+ "summary": "Publish the 1.50.0+skills.1 bundle revision."
4964
+ }
4965
+ ],
4966
+ "entry_sha256": "3fed96311daa5f153704a1ec7ded952e1e00065ce9f81fd4d3350f13beba964a"
4967
+ },
4968
+ {
4969
+ "id": "RL-0211",
4970
+ "sequence": 203,
4971
+ "date": "2026-10-02",
4972
+ "kind": "release",
4973
+ "surface_version": null,
4974
+ "changelog_section": "1.50.0+agent.2",
4975
+ "changelog_sha256": "883416d360a9f1d0886a232259fbca2931d5c2bec48c528a0584d9441985b69f",
4976
+ "agent_impact": "To fill a local CampaignSpec with package, offer and shipping refs, read the campaign with its public Campaigns API key: one GET of https://campaign-map.nextcommerce.com/api/campaign with the key in X-Campaign-Key, as docs/build-packet.md \"Reading package, offer and shipping refs\" shows. Gateway login does not supply these refs; it only lets spec derive --from-store fill the Store Profile fields. The tooling status warnings for a missing gateway login now say so; they stay warnings and the exit code is unchanged.",
4977
+ "compatibility": "compatible",
4978
+ "migration": "none",
4979
+ "changes": [
4980
+ {
4981
+ "class": "named_surface",
4982
+ "path": "docs/build-packet.md",
4983
+ "surface_entry": "docs/build-packet.md",
4984
+ "summary": "Add \"Reading package, offer and shipping refs\" to the local-spec entry: the public-key read of the live campaign, its envelope, and which retrieve-body fields fill campaign.ref_id, page packages, root offers and root shipping methods."
4985
+ },
4986
+ {
4987
+ "class": "cli_surface",
4988
+ "path": "src/cli.mjs",
4989
+ "surface_entry": "tooling",
4990
+ "summary": "The tooling status warning for a missing gateway login says login is optional, only fills the Store Profile fields through spec derive --from-store, never reads package, offer or shipping refs, and points to the public-key read."
4991
+ }
4992
+ ],
4993
+ "entry_sha256": "c1848ed1f25ee7a1069dc27e73872741867454a99b3c6d15b88e1408c2074e04"
4994
+ },
4995
+ {
4996
+ "id": "RL-0212",
4997
+ "sequence": 204,
4998
+ "date": "2026-10-02",
4999
+ "kind": "release",
5000
+ "surface_version": null,
5001
+ "changelog_section": "1.50.0+agent.3",
5002
+ "changelog_sha256": "b2a24c76d61c41e2418bb763e25bdc6290e954e786bd2a58a13e615463605229",
5003
+ "agent_impact": "Do not ask the person to approve the source design's own promo, proof or urgency copy: Build Brief question promo_urgency_copy now covers only the starter template's own promo placeholders (demo timers, promo banners, placeholder voucher codes, exit-pop offers) and is asked only when the CampaignSpec maps funnels[].promo_codes, or a checkout page's enabled exit_intent or promo_code_input. To record an answer to any guided question, copy the normalized draft to campaign-build-brief.json in the target repo, set the fields doctor's build_brief.guided_questions warning names, and re-run start or prepare-build; once a stage has recorded evidence that re-run needs --force, which clears it.",
5004
+ "compatibility": "compatible",
5005
+ "migration": "none",
5006
+ "changes": [
5007
+ {
5008
+ "class": "named_surface",
5009
+ "path": "docs/campaign-build-brief.md",
5010
+ "surface_entry": "docs/campaign-build-brief.md",
5011
+ "summary": "Reword question 5 to the template's own promo placeholders and the CampaignSpec surfaces that raise it, and add Answering The Questions with the fields that close each question and the re-run that records them."
5012
+ },
5013
+ {
5014
+ "class": "cli_surface",
5015
+ "path": "src/cli.mjs",
5016
+ "surface_entry": "next",
5017
+ "summary": "The QA prompt compares the template's own promo placeholders and trust badges with the brief and says not to flag the source design's own proof, urgency or guarantee elements; the build prompt names the template's promo placeholders instead of promo/urgency language."
5018
+ },
5019
+ {
5020
+ "class": "cli_surface",
5021
+ "path": "src/doctor/checks.mjs",
5022
+ "surface_entry": "doctor",
5023
+ "summary": "build_brief.guided_questions names the brief fields that close each open question and how to record them (copy the normalized draft to campaign-build-brief.json, set the fields, re-run start or prepare-build; --force clears stage evidence), and build_brief.questions_unanswered names the fields too."
5024
+ }
5025
+ ],
5026
+ "entry_sha256": "0d60b7a2fa569cca0f1db2084e5691be0fac49b23954b92851cc28d337e6b7c5"
5027
+ },
5028
+ {
5029
+ "id": "RL-0213",
5030
+ "sequence": 205,
5031
+ "date": "2026-10-02",
5032
+ "kind": "release",
5033
+ "surface_version": null,
5034
+ "changelog_section": "1.50.0+agent.4",
5035
+ "changelog_sha256": "57bc8faea8b376e689029a495035237c67c2767aaa072578313935a2a4112200",
5036
+ "agent_impact": "At the QA stage of a campaign whose checkout declares an order bump (is_upsell: true rows), run both QA commands next lists: qa_run, then qa_run_bump, the same qa run --browser --test-order common with --cart <base>:1,<bump>:1, whose test orders carry the add-on. A consumer of next --json that keys on action ids should accept qa_run_bump. Progress snapshots record it as qa_run. The bump is read from the checkout QA's test orders run on; when the CampaignSpec does not parse, next warns next.order_bump_spec_unreadable.",
5037
+ "compatibility": "additive",
5038
+ "migration": "none",
5039
+ "changes": [
5040
+ {
5041
+ "class": "cli_surface",
5042
+ "path": "src/cli.mjs",
5043
+ "surface_entry": "next",
5044
+ "summary": "At the QA stage, when the checkout declares an order bump, next lists qa_run_bump beside qa_run: the same QA command with --cart <first selector tier>:1,<bump>:1. The QA stage prompt and the human next output name it too."
5045
+ },
5046
+ {
5047
+ "class": "named_surface",
5048
+ "path": "docs/qa-and-test-orders.md",
5049
+ "surface_entry": "docs/qa-and-test-orders.md",
5050
+ "summary": "Say that next names the base-plus-bump QA run (qa_run_bump) at the QA stage when the checkout declares an order bump."
5051
+ }
5052
+ ],
5053
+ "entry_sha256": "baedf0070bd55ad5e899b3d697911309bffb4541df7a2c6c1039375ffcf4764d"
5054
+ },
5055
+ {
5056
+ "id": "RL-0214",
5057
+ "sequence": 206,
5058
+ "date": "2026-10-03",
5059
+ "kind": "release",
5060
+ "surface_version": null,
5061
+ "changelog_section": "1.50.0+agent.5",
5062
+ "changelog_sha256": "ac3f1499849d83b2e4ee2610577a0a996eca1199b2fc1ddd95abe95af8d5e423",
5063
+ "agent_impact": "Before the first test order, unless the operator has already said test orders are fine for this campaign, ask once, up front in your first turn with your other setup questions: test orders land in the store as real orders someone may have to cancel. qa run is unchanged and has no permission flag. An installed agent context keeps the old text until install-agent-context refreshes it; start a fresh session after install-skills, since the bundle revision moved to 1.50.0+skills.2.",
5064
+ "compatibility": "compatible",
5065
+ "migration": "none",
5066
+ "changes": [
5067
+ {
5068
+ "class": "documentation",
5069
+ "path": "agents/claude/CLAUDE.md",
5070
+ "surface_entry": "agents/claude/CLAUDE.md",
5071
+ "summary": "Say qa run has no permission flag and coverage is its only control, that test orders still land in the store as real orders someone may have to cancel, and to ask once, up front in the first turn, unless the operator has already said test orders are fine for the campaign."
5072
+ },
5073
+ {
5074
+ "class": "documentation",
5075
+ "path": "agents/codex/AGENTS.md",
5076
+ "surface_entry": "agents/codex/AGENTS.md",
5077
+ "summary": "Say qa run has no permission flag and coverage is its only control, that test orders still land in the store as real orders someone may have to cancel, and to ask once, up front in the first turn, unless the operator has already said test orders are fine for the campaign."
5078
+ },
5079
+ {
5080
+ "class": "documentation",
5081
+ "path": "agents/copilot/copilot-instructions.md",
5082
+ "surface_entry": "agents/copilot/copilot-instructions.md",
5083
+ "summary": "Say qa run has no permission flag and coverage is its only control, that test orders still land in the store as real orders someone may have to cancel, and to ask once, up front in the first turn, unless the operator has already said test orders are fine for the campaign."
5084
+ },
5085
+ {
5086
+ "class": "documentation",
5087
+ "path": "agents/cursor/campaigns-os.mdc",
5088
+ "surface_entry": "agents/cursor/campaigns-os.mdc",
5089
+ "summary": "Say qa run has no permission flag and coverage is its only control, that test orders still land in the store as real orders someone may have to cancel, and to ask once, up front in the first turn, unless the operator has already said test orders are fine for the campaign."
5090
+ },
5091
+ {
5092
+ "class": "named_surface",
5093
+ "path": "docs/skills-revision.md",
5094
+ "surface_entry": "docs/skills-revision.md",
5095
+ "summary": "Use the current 1.50.0+skills.2 bundle in executable examples."
5096
+ },
5097
+ {
5098
+ "class": "skill",
5099
+ "path": "skills.json",
5100
+ "surface_entry": "skills.json",
5101
+ "summary": "Advance the bundled skill revision to 1.50.0+skills.2 and each skill version one patch."
5102
+ },
5103
+ {
5104
+ "class": "skill",
5105
+ "path": "skills/next-campaigns-os/SKILL.md",
5106
+ "surface_entry": null,
5107
+ "summary": "Step 11 says qa run has no permission flag, that test orders land in the store as real orders someone may have to cancel, and to ask once, up front in the first turn, unless the operator has already said test orders are fine. Publish the 1.50.0+skills.2 bundle revision."
5108
+ },
5109
+ {
5110
+ "class": "skill",
5111
+ "path": "skills/next-campaigns-os/references/session-intake.md",
5112
+ "surface_entry": null,
5113
+ "summary": "The test-order proof policy asks once, up front in the first turn, whether test orders are fine for the campaign, unless the operator has already said so, instead of saying they need no permission or approval."
5114
+ },
5115
+ {
5116
+ "class": "skill",
5117
+ "path": "skills/next-campaigns-qa/SKILL.md",
5118
+ "surface_entry": null,
5119
+ "summary": "QA follows an answer the operator already gave on test orders and does not pause to ask again; when nobody asked, it asks once before the first test order. Test orders are no longer called safe to fire any time. Publish the 1.50.0+skills.2 bundle revision."
5120
+ },
5121
+ {
5122
+ "class": "skill",
5123
+ "path": "skills/next-campaigns-os-setup/SKILL.md",
5124
+ "surface_entry": null,
5125
+ "summary": "Publish the 1.50.0+skills.2 bundle revision."
5126
+ },
5127
+ {
5128
+ "class": "skill",
5129
+ "path": "skills/next-campaigns-build/SKILL.md",
5130
+ "surface_entry": null,
5131
+ "summary": "Publish the 1.50.0+skills.2 bundle revision."
5132
+ },
5133
+ {
5134
+ "class": "skill",
5135
+ "path": "skills/next-campaigns-polish/SKILL.md",
5136
+ "surface_entry": null,
5137
+ "summary": "Publish the 1.50.0+skills.2 bundle revision."
5138
+ },
5139
+ {
5140
+ "class": "skill",
5141
+ "path": "skills/campaign-lifecycle-orientation/SKILL.md",
5142
+ "surface_entry": null,
5143
+ "summary": "Publish the 1.50.0+skills.2 bundle revision."
5144
+ },
5145
+ {
5146
+ "class": "skill",
5147
+ "path": "skills/campaign-run-evidence/SKILL.md",
5148
+ "surface_entry": null,
5149
+ "summary": "Publish the 1.50.0+skills.2 bundle revision."
5150
+ },
5151
+ {
5152
+ "class": "skill",
5153
+ "path": "skills/campaign-readback-classification/SKILL.md",
5154
+ "surface_entry": null,
5155
+ "summary": "Publish the 1.50.0+skills.2 bundle revision."
5156
+ },
5157
+ {
5158
+ "class": "skill",
5159
+ "path": "skills/contribution-intake/SKILL.md",
5160
+ "surface_entry": null,
5161
+ "summary": "Publish the 1.50.0+skills.2 bundle revision."
5162
+ }
5163
+ ],
5164
+ "entry_sha256": "b2cabfff7763b6b5782392b81f4586c6198a74a2300b0d69eff4a48de46f9538"
5165
+ },
5166
+ {
5167
+ "id": "RL-0215",
5168
+ "sequence": 207,
5169
+ "date": "2026-10-03",
5170
+ "kind": "release",
5171
+ "surface_version": null,
5172
+ "changelog_section": "1.50.0+agent.7",
5173
+ "changelog_sha256": "a3ffc2011ba990f3022bcd24248869e717f45c276bae10fb726eb2c09c50e6e7",
5174
+ "agent_impact": "sdk storage-check now resolves Page Kit campaign_asset script srcs and frontmatter scripts to src/<slug>/assets/<path>, so a clean Page Kit campaign whose scope covers its assets reports source-compatible instead of unknown. A resolved script outside --scope is still unknown, named by its real path.",
5175
+ "compatibility": "compatible",
5176
+ "migration": "none",
5177
+ "changes": [
5178
+ {
5179
+ "class": "named_surface",
5180
+ "path": "docs/sdk-storage-compatibility.md",
5181
+ "surface_entry": "docs/sdk-storage-compatibility.md",
5182
+ "summary": "Say that a Page Kit page's campaign_asset script srcs and frontmatter scripts resolve to src/<slug>/assets/<path>, and that any other campaign_asset value reports unknown."
5183
+ }
5184
+ ],
5185
+ "entry_sha256": "067e8f610214c37f9066a53c418a866fb6c5670193af54ebb77dd204b653e92b"
5186
+ },
5187
+ {
5188
+ "id": "RL-0217",
5189
+ "sequence": 208,
5190
+ "date": "2026-10-03",
5191
+ "kind": "release",
5192
+ "surface_version": null,
5193
+ "changelog_section": "1.50.0+agent.9",
5194
+ "changelog_sha256": "0b678961d04050148587f2994831880d8e93b86da2dc6a010add319f621d6086",
5195
+ "agent_impact": "Record the page-kit build environment with record build --packet <packet> --build-environment development (local proof mode) instead of hand-editing stages.assembly.evidence.build_environment; next names the command under local-serve. A refused record now lists the allowed values for an enum field.",
5196
+ "compatibility": "additive",
5197
+ "migration": "none",
5198
+ "changes": [
5199
+ {
5200
+ "class": "cli_surface",
5201
+ "path": null,
5202
+ "surface_entry": "record",
5203
+ "summary": "record build takes --build-environment <development|production> and records stages.assembly.evidence.build_environment; a refused record lists a schema enum field's allowed values and the value it got."
5204
+ },
5205
+ {
5206
+ "class": "cli_surface",
5207
+ "path": "src/cli.mjs",
5208
+ "surface_entry": "next",
5209
+ "summary": "Under deploy.target local-serve, next names record build --packet <packet> --build-environment development in the build action and prompt, and the page-kit parity messages name it too."
5210
+ },
5211
+ {
5212
+ "class": "cli_surface",
5213
+ "path": "src/doctor/checks.mjs",
5214
+ "surface_entry": "doctor",
5215
+ "summary": "The local_proof.build_environment warning names record build --build-environment development; an unknown adapter-decision value lists the allowed values."
5216
+ },
5217
+ {
5218
+ "class": "named_surface",
5219
+ "path": "docs/build-packet.md",
5220
+ "surface_entry": "docs/build-packet.md",
5221
+ "summary": "Document record build --build-environment and that enum refusals list the allowed values."
5222
+ },
5223
+ {
5224
+ "class": "named_surface",
5225
+ "path": "docs/qa-and-test-orders.md",
5226
+ "surface_entry": "docs/qa-and-test-orders.md",
5227
+ "summary": "Local proof mode records the development build with record build --build-environment development."
5228
+ }
5229
+ ],
5230
+ "entry_sha256": "80715cb6b6a421a8929126795d1e38ef88aec3585f15539d162c4908165f06ad"
5231
+ },
5232
+ {
5233
+ "id": "RL-0216",
5234
+ "sequence": 209,
5235
+ "date": "2026-10-03",
5236
+ "kind": "release",
5237
+ "surface_version": null,
5238
+ "changelog_section": "1.50.0+agent.10",
5239
+ "changelog_sha256": "0f486e2c02fa7cf57cf606277a02d740a0b6d5767d278728462e846a110db3e8",
5240
+ "agent_impact": "A checkout package marked is_order_bump: true is an order bump everywhere the toolkit tells bumps from tiers: the QA tier planner skips it, next names qa_run_bump for it, and commercial-journey plans its with/without scenarios. Specs that mark bumps with is_upsell: true are unchanged; no spec edit is needed.",
5241
+ "compatibility": "compatible",
5242
+ "migration": "none",
5243
+ "changes": [
5244
+ {
5245
+ "class": "cli_surface",
5246
+ "path": "src/cli.mjs",
5247
+ "surface_entry": "next",
5248
+ "summary": "next names qa_run_bump for a checkout bump marked is_order_bump as well as is_upsell, and its description and the QA test-order notes name both flags."
5249
+ },
5250
+ {
5251
+ "class": "named_surface",
5252
+ "path": "docs/qa-and-test-orders.md",
5253
+ "surface_entry": "docs/qa-and-test-orders.md",
5254
+ "summary": "Say that order-bump rows are those marked is_order_bump or is_upsell, for tier planning and for the qa_run_bump command."
5255
+ }
5256
+ ],
5257
+ "entry_sha256": "5646d540954bcbf43556888627b88ba2390e311e8589f093321c3b5350b516b9"
5258
+ },
5259
+ {
5260
+ "id": "RL-0218",
5261
+ "sequence": 210,
5262
+ "date": "2026-10-03",
5263
+ "kind": "release",
5264
+ "surface_version": null,
5265
+ "changelog_section": "1.50.0+agent.11",
5266
+ "changelog_sha256": "5e70510bf61da0096d4b381caafe2f9e2f6daaffa4895efa073792ded32f1f22",
5267
+ "agent_impact": "When doctor or next warns spec.material_stale, the local CampaignSpec changed materially after prepare-build bound it; QA will refuse the run. Re-run prepare-build from the edited spec before building, polishing or deploying further.",
5268
+ "compatibility": "additive",
5269
+ "migration": "none",
5270
+ "changes": [
5271
+ {
5272
+ "class": "cli_surface",
5273
+ "path": "src/doctor/checks.mjs",
5274
+ "surface_entry": "doctor",
5275
+ "summary": "Doctor warns spec.material_stale when a local-spec campaign's CampaignSpec material hash differs from the Assembly Report's identity.spec_material_hash; next prints it with doctor's other warnings."
5276
+ },
5277
+ {
5278
+ "class": "named_surface",
5279
+ "path": "docs/build-packet.md",
5280
+ "surface_entry": "docs/build-packet.md",
5281
+ "summary": "Say that doctor and next warn spec.material_stale after a material revision of a local spec."
5282
+ }
5283
+ ],
5284
+ "entry_sha256": "69780cf0debe67051b88def9d99f47ce1e5bcfb947218ed6c7917775c431fbcb"
5285
+ },
5286
+ {
5287
+ "id": "RL-0219",
5288
+ "sequence": 211,
5289
+ "date": "2026-10-03",
5290
+ "kind": "release",
5291
+ "surface_version": null,
5292
+ "changelog_section": "1.50.0+agent.12",
5293
+ "changelog_sha256": "a69c5a144ba7982e45d0d838f32c9c1d106376527715a9785ec26e054339723d",
5294
+ "agent_impact": "On the local preview (local-serve, loopback), record deploy now accepts the deploy stage next names after record build when polish was never recorded for this build; do not hand-write a polish skip to get past it. Polish stays owed and QA reports it.",
5295
+ "compatibility": "compatible",
5296
+ "migration": "none",
5297
+ "changes": [
5298
+ {
5299
+ "class": "named_surface",
5300
+ "path": "docs/build-packet.md",
5301
+ "surface_entry": "docs/build-packet.md",
5302
+ "summary": "Say that on the local preview a polish doctor carries forward does not hold record deploy back, as it does not hold next."
5303
+ }
5304
+ ],
5305
+ "entry_sha256": "ab294f178bf7e40547ec76b7b62434c0879a16c5e01b7a34ddb4842d2a9f7e6c"
5306
+ },
5307
+ {
5308
+ "id": "RL-0220",
5309
+ "sequence": 212,
5310
+ "date": "2026-10-03",
5311
+ "kind": "release",
5312
+ "surface_version": null,
5313
+ "changelog_section": "1.50.0+agent.13",
5314
+ "changelog_sha256": "00252143f793272579a0b9a9ba1f663f8e2f7aa7b6a1ec3e385d68cc4f81dc64",
5315
+ "agent_impact": "Strip document wrappers in the converted page-kit page (page_kit.output_path); once it exists, doctor checks that page, not the design. Do not copy built pages over the design source or record preserve_document_wrappers for stripped pages to clear source_html.prep.document_wrapper.",
5316
+ "compatibility": "compatible",
5317
+ "migration": "none",
5318
+ "changes": [
5319
+ {
5320
+ "class": "cli_surface",
5321
+ "path": "src/doctor/checks.mjs",
5322
+ "surface_entry": "doctor",
5323
+ "summary": "source_html.prep.document_wrapper reads the converted page-kit page at page_kit.output_path once it exists, and reports a converted page that kept its wrappers under that path."
5324
+ }
5325
+ ],
5326
+ "entry_sha256": "54969c14bbde17632be2f5256ab2af74b23c41e78687817f8a43d7b522b12683"
5327
+ },
5328
+ {
5329
+ "id": "RL-0221",
5330
+ "sequence": 213,
5331
+ "date": "2026-10-03",
5332
+ "kind": "release",
5333
+ "surface_version": null,
5334
+ "changelog_section": "1.50.0+agent.14",
5335
+ "changelog_sha256": "eaaef3e69436b9ad7239018040281e5b37363135c37bccedf34874ad04981cdc",
5336
+ "agent_impact": "Replace the starter icon-grid placeholders Benefit one through Benefit four on built pages before QA: the placeholder-text residue gate now blocks on them, as it does on Lorem, Placeholder, TODO and Product Name.",
5337
+ "compatibility": "compatible",
5338
+ "migration": "none",
5339
+ "changes": [
5340
+ {
5341
+ "class": "cli_surface",
5342
+ "path": "src/doctor/next-step.mjs",
5343
+ "surface_entry": "doctor",
5344
+ "summary": "The placeholder-text next-step hint names Benefit one through Benefit four with Lorem, Placeholder, TODO and Product Name."
5345
+ }
5346
+ ],
5347
+ "entry_sha256": "79e0ced726df96635e2d4210266cc691a9c95f8d5aaed12bd13d983093c060f0"
5348
+ },
5349
+ {
5350
+ "id": "RL-0222",
5351
+ "sequence": 214,
5352
+ "date": "2026-10-03",
5353
+ "kind": "release",
5354
+ "surface_version": null,
5355
+ "changelog_section": "1.50.0+agent.16",
5356
+ "changelog_sha256": "9739f7ffed587ba5d871a04e4eb1a218d94b47d29cefc9c7798abc49877daa5f",
5357
+ "agent_impact": "A failed brand-theme write no longer leaves theme.warnings[].detail null on the Assembly Report, so record setup and record build stop refusing the report for it. Do not hand-edit the report to clear that refusal.",
5358
+ "compatibility": "compatible",
5359
+ "migration": "none",
5360
+ "changes": [
5361
+ {
5362
+ "class": "cli_surface",
5363
+ "path": "src/cli.mjs",
5364
+ "surface_entry": "prepare-build",
5365
+ "summary": "prepare-build and start copy theme write errors onto the Assembly Report theme.warnings with detail only when it is an object, so the report validates against its schema."
5366
+ }
5367
+ ],
5368
+ "entry_sha256": "7d5cff84f46160230a531540cbfcf272bad32e3c36979d570586650924d9331b"
5369
+ },
5370
+ {
5371
+ "id": "RL-0223",
5372
+ "sequence": 215,
5373
+ "date": "2026-10-03",
5374
+ "kind": "release",
5375
+ "surface_version": null,
5376
+ "changelog_section": "1.50.0+agent.17",
5377
+ "changelog_sha256": "a6f2d75a367e3724e7fb581e172dd5bc85db545fbf636b3675ac72d9a5ba592f",
5378
+ "agent_impact": "Doctor and start now say which CampaignSpec field each of three validation messages wants: campaign.payment_env_key (a Campaigns API key in the spec does not fill it), global_config.sdk_version, and design_source (left off pages built from hand-written or template HTML). Fix the named field rather than treating the key line and the missing-key warning as a contradiction.",
5379
+ "compatibility": "compatible",
5380
+ "migration": "none",
5381
+ "changes": [
5382
+ {
5383
+ "class": "generated_runtime",
5384
+ "path": "campaign-spec/rules/campaign-metadata.ts",
5385
+ "surface_entry": null,
5386
+ "summary": "The missing payment_env_key warning keeps its first sentence and adds that campaign.payment_env_key is empty, where its value comes from, and that a Campaigns API key does not fill it."
5387
+ },
5388
+ {
5389
+ "class": "generated_runtime",
5390
+ "path": "campaign-spec/rules/sdk-version.ts",
5391
+ "surface_entry": null,
5392
+ "summary": "The missing SDK version error keeps its first sentence and names global_config.sdk_version in MAJOR.MINOR.PATCH form."
5393
+ },
5394
+ {
5395
+ "class": "generated_runtime",
5396
+ "path": "campaign-spec/rules/design-source-shape.ts",
5397
+ "surface_entry": null,
5398
+ "summary": "The missing design_source.file_url warning says hand-written or template HTML removes design_source from the page, unless design_source.type is figma or ai-generated."
5399
+ },
5400
+ {
5401
+ "class": "cli_surface",
5402
+ "path": "src/doctor/checks.mjs",
5403
+ "surface_entry": "doctor",
5404
+ "summary": "The no-source-mapping error for a design_source without file_url offers removing design_source for hand-written or template HTML and names the source-html manifest."
5405
+ }
5406
+ ],
5407
+ "entry_sha256": "e9b40ee4e4764bd76dd48a0349e8046bb5e9cff2edb24fd5012566c8fbf05a70"
5408
+ },
5409
+ {
5410
+ "id": "RL-0224",
5411
+ "sequence": 216,
5412
+ "date": "2026-10-03",
5413
+ "kind": "release",
5414
+ "surface_version": null,
5415
+ "changelog_section": "1.50.0+agent.18",
5416
+ "changelog_sha256": "43b3fda70ba8c201c3c092e248b7ef6eea98813539c6527ca06e12e7643ac7e7",
5417
+ "agent_impact": "QA no longer reports price-claim-mismatch on a page showing a voucher the plan cannot price, and browser-order-bump-state reads a transparent glyph tick as unchecked. Do not rework a voucher-priced upsell or a colour-toggled bump tick to clear either warning.",
5418
+ "compatibility": "compatible",
5419
+ "migration": "none",
5420
+ "changes": [
5421
+ {
5422
+ "class": "named_surface",
5423
+ "path": "docs/qa-and-test-orders.md",
5424
+ "surface_entry": null,
5425
+ "summary": "Commercial parity leaves a page's price claims unresolved when the page shows a voucher the normalized plan cannot price."
5426
+ }
5427
+ ],
5428
+ "entry_sha256": "a575bd5b8eb85085f3ba083cc827f1752cb456d3df7584ea2772ef589924e54c"
5429
+ },
5430
+ {
5431
+ "id": "RL-0225",
5432
+ "sequence": 217,
5433
+ "date": "2026-10-03",
5434
+ "kind": "release",
5435
+ "surface_version": null,
5436
+ "changelog_section": "1.50.0+agent.19",
5437
+ "changelog_sha256": "33836079283beb6ac39aed78ed23f5aa4aa4090f7cc424c9c54dd0846837f0bc",
5438
+ "agent_impact": "A campaign-identity finding on a built file that no CampaignSpec page builds to now names it as leftover output under stray_files. Remove the source file if there is one, delete the built file, and rebuild and record the build again; do not retag the stray page.",
5439
+ "compatibility": "compatible",
5440
+ "migration": "none",
5441
+ "changes": [
5442
+ {
5443
+ "class": "cli_surface",
5444
+ "path": "src/doctor/checks.mjs",
5445
+ "surface_entry": "doctor",
5446
+ "summary": "Doctor marks each built page by whether an active CampaignSpec page builds to it before the campaign-identity gate runs."
5447
+ },
5448
+ {
5449
+ "class": "named_surface",
5450
+ "path": "docs/build-packet.md",
5451
+ "surface_entry": null,
5452
+ "summary": "The campaign-identity gate section describes stray_files and the repair for a built file no spec page builds to."
5453
+ }
5454
+ ],
5455
+ "entry_sha256": "6b11a07c55a232f4a461288288807198ba62708b62f07056a4a76e0efc2e75ca"
5456
+ },
5457
+ {
5458
+ "id": "RL-0226",
5459
+ "sequence": 218,
5460
+ "date": "2026-10-04",
5461
+ "kind": "release",
5462
+ "surface_version": "1.51.0",
5463
+ "changelog_section": "1.51.0",
5464
+ "changelog_sha256": "acb40fac6861f258a17cc949e30c2aec372997a69ca4d25df82b133d30c71135",
5465
+ "agent_impact": "Surface 1.51.0. New command checkpoint accept records an operator's accept of a measured QC warning beside the unchanged measurement, and next prints a QC handoff listing open, review, lapsed, unexercised and excluded results with the ref to accept each warning by. Accepts are operator decisions: at the end of QA, run next, present the QC handoff once, and run checkpoint accept only with the refs, reason and name the operator gave you in the conversation, after the warning was shown to them. Never write qc_accepts, qc_results or QA verdict files by hand; the up-front test-order permission does not cover accepts. An accept never changes readiness, a result, the doctor or next status, or the QA disposition, and it lapses when the measured state changes or its evidence is stale or cannot be reproduced. The effects contract declares checkpoint accept (tier B: appends to the Assembly Report, marks the doctor sidecar stale, journals) and its --dry-run form, and declares header-only GETs to the configured store policy URLs on the qa run --browser rows ahead of the check that sends them; QA does not send them yet. Bundled skills carry revision 1.51.0+skills.1: an agent that loaded an earlier revision should start a fresh session. Install the 1.51.0 package with the documented local setup command.",
5466
+ "compatibility": "additive",
5467
+ "migration": "none",
5468
+ "changes": [
5469
+ {
5470
+ "class": "compatibility_policy",
5471
+ "path": "compatibility.json",
5472
+ "surface_entry": null,
5473
+ "summary": "Advance the declared version to 1.51.0."
5474
+ },
5475
+ {
5476
+ "class": "compatibility_policy",
5477
+ "path": "contracts/effects.v1.json",
5478
+ "surface_entry": "contracts/effects.v1.json",
5479
+ "summary": "Declare checkpoint accept (tier B: appends to the Assembly Report's qc_accepts and evidence, marks the doctor sidecar stale, journals; sends nothing) and its --dry-run form, and declare header-only GETs to the CampaignSpec's configured store policy URLs on the two qa run --browser rows, ahead of the check that sends them."
5480
+ },
5481
+ {
5482
+ "class": "compatibility_policy",
5483
+ "path": "contracts/supported-surface.json",
5484
+ "surface_entry": "contracts/supported-surface.json",
5485
+ "summary": "Advance surface_version to 1.51.0 and record the effects contract hash."
5486
+ },
5487
+ {
5488
+ "class": "named_surface",
5489
+ "path": "docs/effects.md",
5490
+ "surface_entry": "docs/effects.md",
5491
+ "summary": "Describe what checkpoint accept records, what it never changes, and when an agent may run it."
5492
+ },
5493
+ {
5494
+ "class": "named_surface",
5495
+ "path": "docs/local-setup.md",
5496
+ "surface_entry": "docs/local-setup.md",
5497
+ "summary": "Pin the 1.51.0 package in the local setup install command."
5498
+ },
5499
+ {
5500
+ "class": "documentation",
5501
+ "path": "docs/orientation-contract-reference.md",
5502
+ "surface_entry": "docs/orientation-contract-reference.md",
5503
+ "summary": "Regenerate at surface 1.51.0."
5504
+ },
5505
+ {
5506
+ "class": "named_surface",
5507
+ "path": "docs/qa-and-test-orders.md",
5508
+ "surface_entry": "docs/qa-and-test-orders.md",
5509
+ "summary": "Add the operator-accept section: what checkpoint accept records, what it never changes, and when an agent may run it."
5510
+ },
5511
+ {
5512
+ "class": "named_surface",
5513
+ "path": "docs/runtime-readiness.md",
5514
+ "surface_entry": "docs/runtime-readiness.md",
5515
+ "summary": "Regenerate at surface 1.51.0."
5516
+ },
5517
+ {
5518
+ "class": "named_surface",
5519
+ "path": "docs/skills-revision.md",
5520
+ "surface_entry": "docs/skills-revision.md",
5521
+ "summary": "Use the current 1.51.0+skills.1 bundle in executable examples."
5522
+ },
5523
+ {
5524
+ "class": "generated_runtime",
5525
+ "path": "package-lock.json",
5526
+ "surface_entry": null,
5527
+ "summary": "Advance the package version to 1.51.0."
5528
+ },
5529
+ {
5530
+ "class": "package_export",
5531
+ "path": "package.json",
5532
+ "surface_entry": null,
5533
+ "summary": "Advance the package version to 1.51.0."
5534
+ },
5535
+ {
5536
+ "class": "skill",
5537
+ "path": "skills.json",
5538
+ "surface_entry": "skills.json",
5539
+ "summary": "Advance the bundled skill revision to 1.51.0+skills.1 and each skill version one patch."
5540
+ },
5541
+ {
5542
+ "class": "skill",
5543
+ "path": "skills/campaign-lifecycle-orientation/SKILL.md",
5544
+ "surface_entry": null,
5545
+ "summary": "Publish the 1.51.0+skills.1 bundle revision."
5546
+ },
5547
+ {
5548
+ "class": "skill",
5549
+ "path": "skills/campaign-readback-classification/SKILL.md",
5550
+ "surface_entry": null,
5551
+ "summary": "Publish the 1.51.0+skills.1 bundle revision."
5552
+ },
5553
+ {
5554
+ "class": "skill",
5555
+ "path": "skills/campaign-run-evidence/SKILL.md",
5556
+ "surface_entry": null,
5557
+ "summary": "Publish the 1.51.0+skills.1 bundle revision."
5558
+ },
5559
+ {
5560
+ "class": "skill",
5561
+ "path": "skills/contribution-intake/SKILL.md",
5562
+ "surface_entry": null,
5563
+ "summary": "Publish the 1.51.0+skills.1 bundle revision."
5564
+ },
5565
+ {
5566
+ "class": "skill",
5567
+ "path": "skills/next-campaigns-build/SKILL.md",
5568
+ "surface_entry": null,
5569
+ "summary": "Publish the 1.51.0+skills.1 bundle revision."
5570
+ },
5571
+ {
5572
+ "class": "skill",
5573
+ "path": "skills/next-campaigns-os-setup/SKILL.md",
5574
+ "surface_entry": null,
5575
+ "summary": "Publish the 1.51.0+skills.1 bundle revision."
5576
+ },
5577
+ {
5578
+ "class": "skill",
5579
+ "path": "skills/next-campaigns-os/SKILL.md",
5580
+ "surface_entry": null,
5581
+ "summary": "Publish the 1.51.0+skills.1 bundle revision."
5582
+ },
5583
+ {
5584
+ "class": "skill",
5585
+ "path": "skills/next-campaigns-polish/SKILL.md",
5586
+ "surface_entry": null,
5587
+ "summary": "Publish the 1.51.0+skills.1 bundle revision."
5588
+ },
5589
+ {
5590
+ "class": "skill",
5591
+ "path": "skills/next-campaigns-qa/SKILL.md",
5592
+ "surface_entry": null,
5593
+ "summary": "At the end of QA, run next and present the QC handoff once, ask the operator which open warnings to accept and why, and run checkpoint accept only with the refs, reason and name the operator gave; never write qc_accepts, qc_results or QA verdict files by hand. Publish the 1.51.0+skills.1 bundle revision."
5594
+ },
5595
+ {
5596
+ "class": "cli_surface",
5597
+ "path": "src/cli.mjs",
5598
+ "surface_entry": "checkpoint",
5599
+ "summary": "Add checkpoint accept (refuses unless every listed result is a current accept-eligible warning already on record, and appends only), a QC handoff in next, and qc_results and qc_build_fingerprint on the QA stage evidence; record ingest refuses the package-owned QC keys."
5600
+ },
5601
+ {
5602
+ "class": "cli_surface",
5603
+ "path": "src/doctor/inspect.mjs",
5604
+ "surface_entry": "doctor",
5605
+ "summary": "Doctor output carries derived.qc_results, empty until a QC check records a result; readiness is unchanged."
5606
+ }
5607
+ ],
5608
+ "entry_sha256": "9702dae850ed7d8c2401f71939cb37eed3b63f09b3b7607f08ad94eccc8338da"
5609
+ },
5610
+ {
5611
+ "id": "RL-0228",
5612
+ "sequence": 219,
5613
+ "date": "2026-10-04",
5614
+ "kind": "release",
5615
+ "surface_version": null,
5616
+ "changelog_section": "1.51.0+agent.1",
5617
+ "changelog_sha256": "d01e35ae07379f131e9a57ce7651061b0e93644b5f18a4a5cd39aa3b4d7f9478",
5618
+ "agent_impact": "Doctor (the packet path and doctor --built) now runs built_output.cart_placeholders on every built page. A known SDK placeholder such as {item.name}, {subtotal} or {package.name} in live built HTML text, or in an alt, title, placeholder, aria-label or button value attribute outside every SDK-owned scope, is a warning (built_output.cart_placeholders.live_token) that next lists in its QC handoff; unknown brace strings and placeholders on a page whose item template selector is not an #id are review results. Move the placeholder into the SDK-owned <template> or item list that renders it, or remove it, and rebuild. A page passes only when its campaign-cart loader names an exact version in the verified list; otherwise, and on a page over a size, candidate, result or page cap or one that cannot be read, the page reads unexercised, never pass. These results are never blockers and never checkpoint gates, so checkpoint waive does not see them.",
5619
+ "compatibility": "additive",
5620
+ "migration": "none",
5621
+ "changes": [
5622
+ {
5623
+ "class": "named_surface",
5624
+ "path": "docs/build-packet.md",
5625
+ "surface_entry": "docs/build-packet.md",
5626
+ "summary": "Describe the raw cart placeholder check: what it warns on, what is expected, and when a page reads unexercised."
5627
+ },
5628
+ {
5629
+ "class": "cli_surface",
5630
+ "path": "src/doctor/checks.mjs",
5631
+ "surface_entry": "doctor",
5632
+ "summary": "Doctor runs the raw cart placeholder check after the script syntax gate on the packet path and records its results in derived.qc_results, with warning and review results in warnings[]."
5633
+ },
5634
+ {
5635
+ "class": "cli_surface",
5636
+ "path": "src/doctor/inspect.mjs",
5637
+ "surface_entry": "doctor",
5638
+ "summary": "doctor --built runs the raw cart placeholder check after the script-syntax check and records its results with the other QC results."
5639
+ }
5640
+ ],
5641
+ "entry_sha256": "925f8d9ad8f524dc8551be91a521d1f29555ce756d2a41c90b95dec16f5bce1f"
5642
+ },
5643
+ {
5644
+ "id": "RL-0231",
5645
+ "sequence": 220,
5646
+ "date": "2026-10-05",
5647
+ "kind": "release",
5648
+ "surface_version": null,
5649
+ "changelog_section": "1.51.0+agent.2",
5650
+ "changelog_sha256": "2dbc67b81e660db15be54ec9939a05cab736eed325f84611252272955b525b31",
5651
+ "agent_impact": "After polish capture, the Assembly Report carries media_weight beside page_load from the same capture, and next reads its image weight and oversize results instead of reporting them as not captured by this version. Run polish capture again to replace page_load evidence captured before this change.",
5652
+ "compatibility": "compatible",
5653
+ "migration": "none",
5654
+ "changes": [
5655
+ {
5656
+ "class": "cli_surface",
5657
+ "path": "src/cli.mjs",
5658
+ "surface_entry": "polish",
5659
+ "summary": "polish capture attaches the media_weight record its capture produced beside page_load in the same report write, and refuses one that is not package-produced or not bound to that page_load."
5660
+ }
5661
+ ],
5662
+ "entry_sha256": "6c7e9fea48195b6c141beec753d619710e4d5c91eb6f1c027bcb814e30366bf4"
5663
+ },
5664
+ {
5665
+ "id": "RL-0227",
5666
+ "sequence": 221,
5667
+ "date": "2026-10-05",
5668
+ "kind": "release",
5669
+ "surface_version": null,
5670
+ "changelog_section": "1.51.0+agent.3",
5671
+ "changelog_sha256": "c2479b7e88ca58ae09277242c2b9a617e934bd514d3892800f888038924b5b01",
5672
+ "agent_impact": "qa run with a browser test order now seeds synthetic tracking values (utm_*, affid, sub1, subaffiliate2 and up to eight names from analytics.params.tracking.preserve) and reports tracking.url (whether each value survives every observed page navigation through the navigation after the order), tracking.order (whether the matching attribution reached the request of an order the store accepted) and tracking.tag (whether os-tracking-tag literals match order metadata) as QC results in the verdict and the next QC handoff. They are warnings or review results, never blockers. A result passes only when every read it depends on completed: an unobserved step, a reload by QA, an attempt that ended early or a hop the browser did not report as a new-document commit ends the measurement without a pass. Click ids and funnel are not seeded. The persisted verdict never holds a query value: every stored string is cut at its first literal or percent-decoded query.",
5673
+ "compatibility": "additive",
5674
+ "migration": "none",
5675
+ "changes": [
5676
+ {
5677
+ "class": "named_surface",
5678
+ "path": "docs/qa-and-test-orders.md",
5679
+ "surface_entry": "docs/qa-and-test-orders.md",
5680
+ "summary": "Describe the tracking parameter results: which values QA seeds, what URL preservation and order attribution report, and what is stored."
5681
+ }
5682
+ ],
5683
+ "entry_sha256": "45f3af2c0db67bb642a1c41f64e01034b031651883ce66cc791ddd38d931ccdb"
5684
+ },
5685
+ {
5686
+ "id": "RL-0229",
5687
+ "sequence": 222,
5688
+ "date": "2026-10-05",
5689
+ "kind": "release",
5690
+ "surface_version": null,
5691
+ "changelog_section": "1.51.0+agent.4",
5692
+ "changelog_sha256": "1330ace51c2b5f767c15601d8ec1e75d140ec943f30dafe7d2dd05e21d454152",
5693
+ "agent_impact": "qa run --browser now checks each analytics.params.content entry at runtime: for each applicable page it loads the page in two fresh browser contexts, without the parameter and with ?<name>=n, and reports content_param QC results in the verdict and the next QC handoff. A result passes only when both loads served the requested document and finished the SDK display pass before the 60 s budget ended, every element whose data-next-hide or data-next-show refers to param.<name> is the same stable element in both loads, visible without the parameter and hidden with it, and no reference needs review. A parameter whose handlers cannot hide anything with n is a warning; compound or unreliably parsed conditions, content hidden at baseline, changed targets, failed loads and pairs beyond the eighth or past the budget are review or unexercised results, never blockers. Runs without --browser list the checks as not requested. The verdict stores a hash of each condition, never its text or a query value.",
5694
+ "compatibility": "additive",
5695
+ "migration": "none",
5696
+ "changes": [
5697
+ {
5698
+ "class": "named_surface",
5699
+ "path": "docs/qa-and-test-orders.md",
5700
+ "surface_entry": "docs/qa-and-test-orders.md",
5701
+ "summary": "Describe the content parameter results: how QA compares the two loads, what reads as a warning, and what never passes."
5702
+ }
5703
+ ],
5704
+ "entry_sha256": "ceb20731f07feccbedea6abe1376b91c8b830036ee1657fcb0f984c55dfc2b53"
5705
+ },
5706
+ {
5707
+ "id": "RL-0230",
5708
+ "sequence": 223,
5709
+ "date": "2026-10-05",
5710
+ "kind": "release",
5711
+ "surface_version": "1.52.0",
5712
+ "changelog_section": "1.52.0",
5713
+ "changelog_sha256": "42e6f8fbe9ed21935c14e69594c5afc6bc6846714b1bd69f88f7e6f556e023fe",
5714
+ "agent_impact": "Surface 1.52.0. qa run --browser now checks each configured store_terms, store_privacy, store_returns, store_shipping and store_contact URL and reports policy.presence and policy.availability QC results in the verdict and the next QC handoff. Presence passes only when QA read the links on every page it visits and one resolves to the configured destination (trailing slash and default port normalized, query kept); a declared footer label that points elsewhere is a warning. Availability passes only when bounded header-only GETs reach a 2xx text/html or application/xhtml+xml page within 5 redirects that differs from the configured URL only in scheme, www. or trailing slash. 404s, server errors and redirects to the store home page are warnings; authentication, rate limits, loops, non-HTML responses, unexpected statuses, non-absolute configured values and redirects elsewhere are review; network failures and anything not finished within the shared 20 s budget or the 15 s per-URL deadline are unexercised. mailto contacts are checked for presence only. Results are never blockers; runs without --browser list them as not requested. Stored destinations carry no query, and a stored record reads back only with exactly the keys QA writes. The effects contract states that qa run --browser sends these header-only GETs to the configured store policy URLs. Bundled skills carry revision 1.52.0+skills.1: an agent that loaded an earlier revision should start a fresh session. Install the 1.52.0 package with the documented local setup command.",
5715
+ "compatibility": "additive",
5716
+ "migration": "none",
5717
+ "changes": [
5718
+ {
5719
+ "class": "compatibility_policy",
5720
+ "path": "compatibility.json",
5721
+ "surface_entry": null,
5722
+ "summary": "Advance the declared version to 1.52.0."
5723
+ },
5724
+ {
5725
+ "class": "compatibility_policy",
5726
+ "path": "contracts/effects.v1.json",
5727
+ "surface_entry": "contracts/effects.v1.json",
5728
+ "summary": "State that the two qa run --browser rows send the header-only GETs to the configured store policy URLs, the offline fixture not observing them only because its browser run is blocked at the gate; and state that the offline checkpoint accept fixture is refused (changed_since_handoff) because its synthetic result ref matches no current result, while doctor, Polish and QA checks produce accept-eligible warnings."
5729
+ },
5730
+ {
5731
+ "class": "compatibility_policy",
5732
+ "path": "contracts/supported-surface.json",
5733
+ "surface_entry": "contracts/supported-surface.json",
5734
+ "summary": "Advance surface_version to 1.52.0 and record the effects contract hash."
5735
+ },
5736
+ {
5737
+ "class": "named_surface",
5738
+ "path": "docs/local-setup.md",
5739
+ "surface_entry": "docs/local-setup.md",
5740
+ "summary": "Pin the 1.52.0 package in the local setup install command."
5741
+ },
5742
+ {
5743
+ "class": "documentation",
5744
+ "path": "docs/orientation-contract-reference.md",
5745
+ "surface_entry": "docs/orientation-contract-reference.md",
5746
+ "summary": "Regenerate at surface 1.52.0."
5747
+ },
5748
+ {
5749
+ "class": "named_surface",
5750
+ "path": "docs/qa-and-test-orders.md",
5751
+ "surface_entry": "docs/qa-and-test-orders.md",
5752
+ "summary": "Describe the policy link results: what presence and availability check, which outcomes are warnings or review results, and what is not requested without --browser."
5753
+ },
5754
+ {
5755
+ "class": "named_surface",
5756
+ "path": "docs/runtime-readiness.md",
5757
+ "surface_entry": "docs/runtime-readiness.md",
5758
+ "summary": "Regenerate at surface 1.52.0."
5759
+ },
5760
+ {
5761
+ "class": "named_surface",
5762
+ "path": "docs/skills-revision.md",
5763
+ "surface_entry": "docs/skills-revision.md",
5764
+ "summary": "Use the current 1.52.0+skills.1 bundle in executable examples."
5765
+ },
5766
+ {
5767
+ "class": "generated_runtime",
5768
+ "path": "package-lock.json",
5769
+ "surface_entry": null,
5770
+ "summary": "Advance the package version to 1.52.0."
5771
+ },
5772
+ {
5773
+ "class": "package_export",
5774
+ "path": "package.json",
5775
+ "surface_entry": null,
5776
+ "summary": "Advance the package version to 1.52.0."
5777
+ },
5778
+ {
5779
+ "class": "skill",
5780
+ "path": "skills.json",
5781
+ "surface_entry": "skills.json",
5782
+ "summary": "Advance the bundled skill revision to 1.52.0+skills.1 and each skill version one patch."
5783
+ },
5784
+ {
5785
+ "class": "skill",
5786
+ "path": "skills/campaign-lifecycle-orientation/SKILL.md",
5787
+ "surface_entry": null,
5788
+ "summary": "Publish the 1.52.0+skills.1 bundle revision."
5789
+ },
5790
+ {
5791
+ "class": "skill",
5792
+ "path": "skills/campaign-readback-classification/SKILL.md",
5793
+ "surface_entry": null,
5794
+ "summary": "Publish the 1.52.0+skills.1 bundle revision."
5795
+ },
5796
+ {
5797
+ "class": "skill",
5798
+ "path": "skills/campaign-run-evidence/SKILL.md",
5799
+ "surface_entry": null,
5800
+ "summary": "Publish the 1.52.0+skills.1 bundle revision."
5801
+ },
5802
+ {
5803
+ "class": "skill",
5804
+ "path": "skills/contribution-intake/SKILL.md",
5805
+ "surface_entry": null,
5806
+ "summary": "Publish the 1.52.0+skills.1 bundle revision."
5807
+ },
5808
+ {
5809
+ "class": "skill",
5810
+ "path": "skills/next-campaigns-build/SKILL.md",
5811
+ "surface_entry": null,
5812
+ "summary": "Publish the 1.52.0+skills.1 bundle revision."
5813
+ },
5814
+ {
5815
+ "class": "skill",
5816
+ "path": "skills/next-campaigns-os-setup/SKILL.md",
5817
+ "surface_entry": null,
5818
+ "summary": "Publish the 1.52.0+skills.1 bundle revision."
5819
+ },
5820
+ {
5821
+ "class": "skill",
5822
+ "path": "skills/next-campaigns-os/SKILL.md",
5823
+ "surface_entry": null,
5824
+ "summary": "Publish the 1.52.0+skills.1 bundle revision."
5825
+ },
5826
+ {
5827
+ "class": "skill",
5828
+ "path": "skills/next-campaigns-polish/SKILL.md",
5829
+ "surface_entry": null,
5830
+ "summary": "Publish the 1.52.0+skills.1 bundle revision."
5831
+ },
5832
+ {
5833
+ "class": "skill",
5834
+ "path": "skills/next-campaigns-qa/SKILL.md",
5835
+ "surface_entry": null,
5836
+ "summary": "Publish the 1.52.0+skills.1 bundle revision."
5837
+ }
5838
+ ],
5839
+ "entry_sha256": "303fbf65d9d538ae55340e7f1606b3acae50453ead24740ddd39149e77082f41"
5840
+ },
5841
+ {
5842
+ "id": "RL-0232",
5843
+ "sequence": 224,
5844
+ "date": "2026-10-05",
5845
+ "kind": "release",
5846
+ "surface_version": null,
5847
+ "changelog_section": "1.52.0+agent.1",
5848
+ "changelog_sha256": "8db55e2af8d696493a8c2881667ae538329a101cf5c5c582bc5d0c6e50ca91c9",
5849
+ "agent_impact": "Doctor (the packet path and doctor --built) now runs built_output.smoke_qc on every built page. It warns on an in-page link whose target is missing, a missing favicon or Open Graph title, description or image, an og:image that is not absolute or whose file is missing, the Tailwind CDN script in a production build, references to the cdn.29next.store asset host, and loopback URLs in a production build; next lists these in its QC handoff. Fix the page and rebuild. The Tailwind and loopback rules are decided only for a recorded production build and read unexercised otherwise; a page over a size, candidate, result or page cap, or one that cannot be read, reads unexercised, never pass. These results are never blockers and never checkpoint gates.",
5850
+ "compatibility": "additive",
5851
+ "migration": "none",
5852
+ "changes": [
5853
+ {
5854
+ "class": "named_surface",
5855
+ "path": "docs/build-packet.md",
5856
+ "surface_entry": "docs/build-packet.md",
5857
+ "summary": "Describe the built-output smoke checks: what each rule warns on, which rules need a production build, and when a page reads unexercised."
5858
+ },
5859
+ {
5860
+ "class": "cli_surface",
5861
+ "path": "src/doctor/checks.mjs",
5862
+ "surface_entry": "doctor",
5863
+ "summary": "Doctor runs the smoke checks after the raw cart placeholder check on the packet path and records their results in derived.qc_results, with warning and review results in warnings[]."
5864
+ },
5865
+ {
5866
+ "class": "cli_surface",
5867
+ "path": "src/doctor/inspect.mjs",
5868
+ "surface_entry": "doctor",
5869
+ "summary": "doctor --built runs the smoke checks after the raw cart placeholder check, with the build environment and deploy base unknown, and records their results with the other QC results."
5870
+ }
5871
+ ],
5872
+ "entry_sha256": "e9063da2788630cb0017eedc0b2e77b717b290bae0e7cb5d6bcdbbb6e6b7368e"
4634
5873
  }
4635
5874
  ]
4636
5875
  }