@nextcommerce/campaigns-os 1.52.0 → 1.54.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 (76) hide show
  1. package/CHANGELOG.md +109 -0
  2. package/README.md +1 -0
  3. package/agents/claude/CLAUDE.md +2 -0
  4. package/agents/codex/AGENTS.md +2 -0
  5. package/agents/copilot/copilot-instructions.md +2 -0
  6. package/agents/cursor/campaigns-os.mdc +2 -0
  7. package/compatibility.json +1 -1
  8. package/contracts/campaign-cart-checkout-field-contract.v0.json +10 -0
  9. package/contracts/campaign-cart-sdk-support-policy.v0.json +2 -2
  10. package/contracts/commerce-surface-catalog.json +27 -27
  11. package/contracts/effects.v1.json +295 -47
  12. package/contracts/release-ledger.json +660 -0
  13. package/contracts/supported-surface.json +3 -3
  14. package/contracts/template-brand-contract.shared-commerce.v0.json +1 -1
  15. package/docs/brand-theme-bridge.md +2 -0
  16. package/docs/build-packet.md +67 -19
  17. package/docs/campaign-build-brief.md +48 -17
  18. package/docs/campaign-standardization-report.md +32 -0
  19. package/docs/design-source-package.md +7 -3
  20. package/docs/effects.md +10 -1
  21. package/docs/local-setup.md +1 -1
  22. package/docs/orientation-contract-reference.md +1 -1
  23. package/docs/polish-evidence.md +2 -0
  24. package/docs/progress-snapshots.md +5 -5
  25. package/docs/qa-and-test-orders.md +30 -3
  26. package/docs/readback.md +19 -2
  27. package/docs/runtime-readiness.md +1 -1
  28. package/docs/sdk-storage-compatibility.md +15 -0
  29. package/docs/skills-revision.md +10 -10
  30. package/docs/supported-surface.md +1 -0
  31. package/package.json +1 -1
  32. package/schemas/campaign-runtime-assembly-report.v0.schema.json +5 -1
  33. package/skills/campaign-lifecycle-orientation/SKILL.md +3 -3
  34. package/skills/campaign-readback-classification/SKILL.md +3 -3
  35. package/skills/campaign-run-evidence/SKILL.md +3 -3
  36. package/skills/contribution-intake/SKILL.md +3 -3
  37. package/skills/next-campaigns-build/SKILL.md +5 -3
  38. package/skills/next-campaigns-os/SKILL.md +10 -19
  39. package/skills/next-campaigns-os/references/session-intake.md +10 -6
  40. package/skills/next-campaigns-os-setup/SKILL.md +4 -3
  41. package/skills/next-campaigns-polish/SKILL.md +7 -5
  42. package/skills/next-campaigns-qa/SKILL.md +5 -3
  43. package/skills.json +10 -10
  44. package/src/brand-theme.mjs +21 -20
  45. package/src/brief-summary.mjs +275 -0
  46. package/src/build-brief.mjs +167 -15
  47. package/src/campaign-ecosystem.mjs +153 -31
  48. package/src/cli.mjs +182 -115
  49. package/src/contrast.mjs +649 -0
  50. package/src/design-source-publication.mjs +110 -3
  51. package/src/directory-lock.mjs +79 -7
  52. package/src/doctor/checks.mjs +141 -16
  53. package/src/doctor/inspect.mjs +13 -0
  54. package/src/doctor/next-step.mjs +15 -6
  55. package/src/input-currency.mjs +394 -0
  56. package/src/input-refresh.mjs +708 -0
  57. package/src/invocation.mjs +6 -2
  58. package/src/polish-browser.mjs +503 -201
  59. package/src/polish-deadline.mjs +7 -0
  60. package/src/polish-node.mjs +326 -46
  61. package/src/polish-readability.mjs +828 -0
  62. package/src/progress-node.mjs +18 -5
  63. package/src/qa-browser.mjs +211 -93
  64. package/src/qa-node.mjs +47 -7
  65. package/src/qc-accept.mjs +44 -8
  66. package/src/qc-check-registry.mjs +15 -7
  67. package/src/qc-results.mjs +326 -34
  68. package/src/readback.mjs +58 -10
  69. package/src/sdk-attribute-index.mjs +111 -23
  70. package/src/sdk-markup.mjs +49 -10
  71. package/src/sdk-repin.mjs +282 -0
  72. package/src/stage-ledger.mjs +235 -44
  73. package/src/stage-record.mjs +154 -30
  74. package/src/standardization-report.mjs +26 -1
  75. package/src/target-lock.mjs +9 -1
  76. package/src/tooling-setup.mjs +1 -1
@@ -5870,6 +5870,666 @@
5870
5870
  }
5871
5871
  ],
5872
5872
  "entry_sha256": "e9063da2788630cb0017eedc0b2e77b717b290bae0e7cb5d6bcdbbb6e6b7368e"
5873
+ },
5874
+ {
5875
+ "id": "RL-0233",
5876
+ "sequence": 225,
5877
+ "date": "2026-10-05",
5878
+ "kind": "release",
5879
+ "surface_version": "1.53.0",
5880
+ "changelog_section": "1.53.0",
5881
+ "changelog_sha256": "b5e6bbfd3ab22a16b715fbd574128715ab5a9a70d76c1e09f8f91c1d25ce72f6",
5882
+ "agent_impact": "Surface 1.53.0. Adds record brief, which saves Campaign Build Brief answers without re-running intake, and record spec, which binds a CampaignSpec change without discarding operator state; their --dry-run forms write nothing and append no lifecycle entry. A brief file is guided unless it sets \"brief_mode\": \"prepared\" (a campaign whose report already records a prepared brief stays prepared). An unchanged or reformatted save keeps every stage's evidence and status. A material brief or CampaignSpec change makes build, Polish and QA owed again (QA alone for a qa_policy change), keeps the last five superseded records per stage as history that is never current proof, and next, doctor, progress, readback and the Assembly Report status report the owed stage; next offers refresh_inputs (record brief or record spec) when a recorded stage was made against earlier content. Build, Polish and QA records now stamp the brief and CampaignSpec content they were made against; records without stamps read unconfirmed. Re-recording an unchanged build after an input change keeps the build owed unless the operator's --deviation-reason records that the change needs no output change; Polish stays owed until a new capture postdates the change. Intake refuses, without --force, to discard recorded waivers, warning accepts, stage history, an applied theme, or a recorded deploy target, preview URL, production URL, order-path depth or allowed-domains confirmation; --force archives the build, Polish and QA records it clears and keeps stage history. spec derive no longer rebinds report identity and its --json result no longer carries rebound; run record spec after it. Bundled skills carry revision 1.53.0+skills.1: an agent that loaded an earlier revision should start a fresh session. Install the 1.53.0 package with the documented local setup command.",
5883
+ "compatibility": "breaking",
5884
+ "migration": "After upgrading, next routes each in-flight campaign back to build once, because build, Polish and QA records made before 1.53.0 do not record which brief and CampaignSpec content they used: re-record build and Polish, and run QA again for a new verdict. Add \"brief_mode\": \"prepared\" to a hand-written brief file whose open questions should block. Save brief answers with record brief and CampaignSpec changes with record spec instead of re-running start, prepare-build or build, which now refuse without --force to discard recorded waivers, warning accepts, stage history, an applied theme, or a recorded deploy target, preview URL, production URL, order-path depth or allowed-domains confirmation. Run record spec after spec derive, and stop reading rebound from spec derive --json.",
5885
+ "changes": [
5886
+ {
5887
+ "class": "compatibility_policy",
5888
+ "path": "compatibility.json",
5889
+ "surface_entry": null,
5890
+ "summary": "Advance the declared version to 1.53.0."
5891
+ },
5892
+ {
5893
+ "class": "compatibility_policy",
5894
+ "path": "contracts/effects.v1.json",
5895
+ "surface_entry": "contracts/effects.v1.json",
5896
+ "summary": "Declare the record brief and record spec rows (tier C) and their --dry-run rows (tier none); correct the start, prepare-build and build notes (refused without --force when the report carries stage evidence, stage history or operator decisions) and their --force notes (completed build, Polish and QA records are archived into stage history, which is kept); state that record build writes input_change and makes Polish and QA owed when it detects a brief or CampaignSpec change; and state that record polish, record theme and record deploy are refused while an earlier stage is owed again."
5897
+ },
5898
+ {
5899
+ "class": "compatibility_policy",
5900
+ "path": "contracts/supported-surface.json",
5901
+ "surface_entry": "contracts/supported-surface.json",
5902
+ "summary": "Advance surface_version to 1.53.0 and record the effects contract hash."
5903
+ },
5904
+ {
5905
+ "class": "named_surface",
5906
+ "path": "docs/build-packet.md",
5907
+ "surface_entry": "docs/build-packet.md",
5908
+ "summary": "Describe CampaignSpec material changes for local-spec, saved-Map and gateway packets, record spec, spec derive no longer rebinding identity, and the brief and CampaignSpec dependency map."
5909
+ },
5910
+ {
5911
+ "class": "named_surface",
5912
+ "path": "docs/campaign-build-brief.md",
5913
+ "surface_entry": "docs/campaign-build-brief.md",
5914
+ "summary": "Replace Answering The Questions with saving answers through record brief, the brief_mode rule, which changes make which stages owed again, stage history, --deviation-reason, and the one-time re-proof of records made before 1.53.0."
5915
+ },
5916
+ {
5917
+ "class": "named_surface",
5918
+ "path": "docs/effects.md",
5919
+ "surface_entry": "docs/effects.md",
5920
+ "summary": "Describe what record brief and record spec write and refuse, their dry runs, and the intake refusal and --force archive."
5921
+ },
5922
+ {
5923
+ "class": "named_surface",
5924
+ "path": "docs/local-setup.md",
5925
+ "surface_entry": "docs/local-setup.md",
5926
+ "summary": "Pin the 1.53.0 package in the local setup install command."
5927
+ },
5928
+ {
5929
+ "class": "documentation",
5930
+ "path": "docs/orientation-contract-reference.md",
5931
+ "surface_entry": "docs/orientation-contract-reference.md",
5932
+ "summary": "Regenerate at surface 1.53.0."
5933
+ },
5934
+ {
5935
+ "class": "named_surface",
5936
+ "path": "docs/progress-snapshots.md",
5937
+ "surface_entry": "docs/progress-snapshots.md",
5938
+ "summary": "Stage records carry each stage's effective status: a stage owed again by a brief or CampaignSpec change reads required, and one whose inputs cannot be confirmed reads unknown."
5939
+ },
5940
+ {
5941
+ "class": "named_surface",
5942
+ "path": "docs/readback.md",
5943
+ "surface_entry": "docs/readback.md",
5944
+ "summary": "The STAGES header prints the recorded and the effective report status, and a stage line whose effective status differs adds the recorded status and the reason."
5945
+ },
5946
+ {
5947
+ "class": "named_surface",
5948
+ "path": "docs/runtime-readiness.md",
5949
+ "surface_entry": "docs/runtime-readiness.md",
5950
+ "summary": "Regenerate at surface 1.53.0."
5951
+ },
5952
+ {
5953
+ "class": "named_surface",
5954
+ "path": "docs/skills-revision.md",
5955
+ "surface_entry": "docs/skills-revision.md",
5956
+ "summary": "Use the current 1.53.0+skills.1 bundle in executable examples."
5957
+ },
5958
+ {
5959
+ "class": "generated_runtime",
5960
+ "path": "package-lock.json",
5961
+ "surface_entry": null,
5962
+ "summary": "Advance the package version to 1.53.0."
5963
+ },
5964
+ {
5965
+ "class": "package_export",
5966
+ "path": "package.json",
5967
+ "surface_entry": null,
5968
+ "summary": "Advance the package version to 1.53.0."
5969
+ },
5970
+ {
5971
+ "class": "skill",
5972
+ "path": "skills.json",
5973
+ "surface_entry": "skills.json",
5974
+ "summary": "Advance the bundled skill revision to 1.53.0+skills.1 and each skill version one patch."
5975
+ },
5976
+ {
5977
+ "class": "skill",
5978
+ "path": "skills/campaign-lifecycle-orientation/SKILL.md",
5979
+ "surface_entry": null,
5980
+ "summary": "Publish the 1.53.0+skills.1 bundle revision."
5981
+ },
5982
+ {
5983
+ "class": "skill",
5984
+ "path": "skills/campaign-readback-classification/SKILL.md",
5985
+ "surface_entry": null,
5986
+ "summary": "Publish the 1.53.0+skills.1 bundle revision."
5987
+ },
5988
+ {
5989
+ "class": "skill",
5990
+ "path": "skills/campaign-run-evidence/SKILL.md",
5991
+ "surface_entry": null,
5992
+ "summary": "Publish the 1.53.0+skills.1 bundle revision."
5993
+ },
5994
+ {
5995
+ "class": "skill",
5996
+ "path": "skills/contribution-intake/SKILL.md",
5997
+ "surface_entry": null,
5998
+ "summary": "Publish the 1.53.0+skills.1 bundle revision."
5999
+ },
6000
+ {
6001
+ "class": "skill",
6002
+ "path": "skills/next-campaigns-build/SKILL.md",
6003
+ "surface_entry": null,
6004
+ "summary": "Publish the 1.53.0+skills.1 bundle revision."
6005
+ },
6006
+ {
6007
+ "class": "skill",
6008
+ "path": "skills/next-campaigns-os-setup/SKILL.md",
6009
+ "surface_entry": null,
6010
+ "summary": "Publish the 1.53.0+skills.1 bundle revision."
6011
+ },
6012
+ {
6013
+ "class": "skill",
6014
+ "path": "skills/next-campaigns-os/SKILL.md",
6015
+ "surface_entry": null,
6016
+ "summary": "Publish the 1.53.0+skills.1 bundle revision."
6017
+ },
6018
+ {
6019
+ "class": "skill",
6020
+ "path": "skills/next-campaigns-polish/SKILL.md",
6021
+ "surface_entry": null,
6022
+ "summary": "Publish the 1.53.0+skills.1 bundle revision."
6023
+ },
6024
+ {
6025
+ "class": "skill",
6026
+ "path": "skills/next-campaigns-qa/SKILL.md",
6027
+ "surface_entry": null,
6028
+ "summary": "Publish the 1.53.0+skills.1 bundle revision."
6029
+ },
6030
+ {
6031
+ "class": "cli_surface",
6032
+ "path": "src/cli.mjs",
6033
+ "surface_entry": "record",
6034
+ "summary": "Add record brief and record spec to the usage text; intake binds the brief material and refuses to discard operator state without --force; QA records stamp their inputs; next carries input_currency, offers refresh_inputs and notes an operator's unchanged-output decision in the QC handoff; spec derive no longer rebinds report identity, drops the rebound result field and names record spec."
6035
+ },
6036
+ {
6037
+ "class": "cli_surface",
6038
+ "path": "src/doctor/checks.mjs",
6039
+ "surface_entry": "doctor",
6040
+ "summary": "Doctor reports input currency in derived.input_currency and warns spec.material_stale, spec.binding_unknown, build_brief.material_changed, build_brief.binding_unknown, build_brief.input_unsaved, assembly.output_unchanged_after_input_change and assembly.output_unchanged_by_operator_decision; a normalized brief that is not valid JSON, or not a JSON object, is the build_brief.normalized_path error, not a crash."
6041
+ },
6042
+ {
6043
+ "class": "cli_surface",
6044
+ "path": "src/doctor/next-step.mjs",
6045
+ "surface_entry": "next",
6046
+ "summary": "The stage picker reads each stage's effective status, so a stage owed again by a brief or CampaignSpec change, or one whose inputs cannot be confirmed, is the stage next recommends."
6047
+ }
6048
+ ],
6049
+ "entry_sha256": "85e37bd6392dcfa8415a654897eb8dbe8ab417fc9c92ec21732d2fff5a5f5f5b"
6050
+ },
6051
+ {
6052
+ "id": "RL-0234",
6053
+ "sequence": 226,
6054
+ "date": "2026-10-05",
6055
+ "kind": "release",
6056
+ "surface_version": null,
6057
+ "changelog_section": "1.53.0+agent.1",
6058
+ "changelog_sha256": "b865a430b924ff48016930621ba3905deb7861516d9dfdabfd797ed5aaebf6db",
6059
+ "agent_impact": "polish capture now measures text readability on every built page at desktop and mobile widths and attaches it as stages.polish.evidence.visual_review.readability; next lists readability.contrast warnings, review and coverage results in its QC handoff, grouping each warning colour pair across pages and widths for one checkpoint accept. On a campaign whose every mapped page is template stock, polish capture measures readability, prints the page-load no_capturable_routes message as a warning, and exits 0 with status captured_with_warnings; record polish still refuses a completed Polish record there. Polish media weight and readability results read as stale when doctor reports the built output changed since record build. Readability results never block Polish or change readiness. QA's browser-primary-cta check now runs on every page with an expected_next_url, whatever its page type, and measures every visible route-matching CTA (not only the most readable one) and each piece of text inside it, unrounded, with the same measurement Polish uses, against the requirement for its own size; its evidence lists each candidate's elements[] with contrast_ratio_exact and required_ratio. A CTA observed incompletely (the SDK, stylesheets, fonts or its text not ready, a review trigger, text generated by ::before or ::after, or disabled controls) reads manual_review at severity warn, never pass, and so does a page whose inspection script errors (inspection_error, earlier a fail). So browser-primary-cta results on existing campaigns can change in either direction: pages that were skipped are now checked, a second CTA or child text can now fail, large bold text at 3:1 can now pass, and incomplete observations read manual_review instead of pass or fail. The brand theme generator compares contrast unrounded, so a declared colour in [4.495, 4.5) now adds theme.foreground.low_contrast; generated CSS and colour choices are unchanged.",
6060
+ "compatibility": "additive",
6061
+ "migration": "none",
6062
+ "changes": [
6063
+ {
6064
+ "class": "cli_surface",
6065
+ "path": "src/cli.mjs",
6066
+ "surface_entry": "polish",
6067
+ "summary": "polish capture attaches the readability record beside page_load (which now carries captured_at), and on a campaign with no mapped pages measures readability only, reports the held page-load message as a warning and exits 0."
6068
+ },
6069
+ {
6070
+ "class": "named_surface",
6071
+ "path": "docs/qa-and-test-orders.md",
6072
+ "surface_entry": "docs/qa-and-test-orders.md",
6073
+ "summary": "Describe accepting a readability warning: one colour pair and size class per page and width, what orphans or lapses the accept, and that it never hides review, unexercised or excluded results."
6074
+ },
6075
+ {
6076
+ "class": "named_surface",
6077
+ "path": "docs/brand-theme-bridge.md",
6078
+ "surface_entry": "docs/brand-theme-bridge.md",
6079
+ "summary": "State that theme contrast uses the same unrounded measurement as Polish and QA, so a declared colour at 4.495:1 now warns, and that the generator's colour choices are unchanged."
6080
+ }
6081
+ ],
6082
+ "entry_sha256": "b75e489a53ea7b60a3a9b3037f6f17c96b13c2960a1cbd34eb7a3cc69b54f617"
6083
+ },
6084
+ {
6085
+ "id": "RL-0235",
6086
+ "sequence": 227,
6087
+ "date": "2026-10-05",
6088
+ "kind": "release",
6089
+ "surface_version": null,
6090
+ "changelog_section": "1.53.0+agent.2",
6091
+ "changelog_sha256": "a7fc7d90ee83e6ad44d310d77942e00de56656259e9c754eec14cd5bd8d124d4",
6092
+ "agent_impact": "next prints a campaign intent summary, generated from the normalized Campaign Build Brief, on every result (intent_summary in JSON, a Campaign intent section in text) and at the top of the setup, build, Polish and QA prompts. Each value carries its origin (stated, from the source, default, not stated, or source not recorded); values are quoted data, purpose and palette source inferred from page types or names read not stated, and nothing reads the summary, so it never sets prices or commerce behaviour. The four agent context files and the setup, build, Polish and QA skills tell agents to read .campaign-runtime/input/campaign-build-brief.normalized.json and the recorded assembly decisions. Bundled skills carry revision 1.53.0+skills.2: an agent that loaded an earlier revision should start a fresh session. The lifecycle skill returns the single compact brief in references/session-intake.md (Intent: is now Work:, with a new Campaign: field and Proof policy:) and saves brief answers with record brief after asking the operator; the build skill passes --deviation-reason only on the operator's explicit decision, the Polish skill records a skipped Polish only on the operator's decision, and the Polish and QA skills report readability warnings and offer repairs inside the brand palette. tooling setup refuses an installed agent context from an earlier release and names install-agent-context --target . in its refusal.",
6093
+ "compatibility": "breaking",
6094
+ "migration": "From each existing campaign folder: install the exact 1.53.0 package, run npx --no-install campaigns-os install-agent-context --target . (it overwrites all four files under .campaign-runtime/agent-context/; local edits there are lost), review and commit the diff, rerun npx --no-install campaigns-os tooling setup --target . --platform claude, and restart the agent session. Codex, Cursor and Copilot users run install-agent-context and reinstall skills with install-skills --platform codex (or agents).",
6095
+ "changes": [
6096
+ {
6097
+ "class": "documentation",
6098
+ "path": "agents/claude/CLAUDE.md",
6099
+ "surface_entry": "agents/claude/CLAUDE.md",
6100
+ "summary": "Add the generic campaign paragraph: what a NEXT campaign is, who owns creative intent and commerce behaviour, read the normalized brief and the recorded decisions before changing a campaign, treat the intent summary as orientation only, and ask the operator before saving brief answers."
6101
+ },
6102
+ {
6103
+ "class": "documentation",
6104
+ "path": "agents/codex/AGENTS.md",
6105
+ "surface_entry": "agents/codex/AGENTS.md",
6106
+ "summary": "Add the generic campaign paragraph: what a NEXT campaign is, who owns creative intent and commerce behaviour, read the normalized brief and the recorded decisions before changing a campaign, treat the intent summary as orientation only, and ask the operator before saving brief answers."
6107
+ },
6108
+ {
6109
+ "class": "documentation",
6110
+ "path": "agents/copilot/copilot-instructions.md",
6111
+ "surface_entry": "agents/copilot/copilot-instructions.md",
6112
+ "summary": "Add the generic campaign paragraph: what a NEXT campaign is, who owns creative intent and commerce behaviour, read the normalized brief and the recorded decisions before changing a campaign, treat the intent summary as orientation only, and ask the operator before saving brief answers."
6113
+ },
6114
+ {
6115
+ "class": "documentation",
6116
+ "path": "agents/cursor/campaigns-os.mdc",
6117
+ "surface_entry": "agents/cursor/campaigns-os.mdc",
6118
+ "summary": "Add the generic campaign paragraph: what a NEXT campaign is, who owns creative intent and commerce behaviour, read the normalized brief and the recorded decisions before changing a campaign, treat the intent summary as orientation only, and ask the operator before saving brief answers."
6119
+ },
6120
+ {
6121
+ "class": "named_surface",
6122
+ "path": "docs/skills-revision.md",
6123
+ "surface_entry": "docs/skills-revision.md",
6124
+ "summary": "Use the current 1.53.0+skills.2 bundle in executable examples."
6125
+ },
6126
+ {
6127
+ "class": "skill",
6128
+ "path": "skills.json",
6129
+ "surface_entry": "skills.json",
6130
+ "summary": "Advance the bundled skill revision to 1.53.0+skills.2 and each skill version one patch."
6131
+ },
6132
+ {
6133
+ "class": "skill",
6134
+ "path": "skills/campaign-lifecycle-orientation/SKILL.md",
6135
+ "surface_entry": null,
6136
+ "summary": "Publish the 1.53.0+skills.2 bundle revision."
6137
+ },
6138
+ {
6139
+ "class": "skill",
6140
+ "path": "skills/campaign-readback-classification/SKILL.md",
6141
+ "surface_entry": null,
6142
+ "summary": "Publish the 1.53.0+skills.2 bundle revision."
6143
+ },
6144
+ {
6145
+ "class": "skill",
6146
+ "path": "skills/campaign-run-evidence/SKILL.md",
6147
+ "surface_entry": null,
6148
+ "summary": "Publish the 1.53.0+skills.2 bundle revision."
6149
+ },
6150
+ {
6151
+ "class": "skill",
6152
+ "path": "skills/contribution-intake/SKILL.md",
6153
+ "surface_entry": null,
6154
+ "summary": "Publish the 1.53.0+skills.2 bundle revision."
6155
+ },
6156
+ {
6157
+ "class": "skill",
6158
+ "path": "skills/next-campaigns-build/SKILL.md",
6159
+ "surface_entry": null,
6160
+ "summary": "Publish the 1.53.0+skills.2 bundle revision; read the normalized brief and the recorded decisions; rebuild after an input change and pass --deviation-reason to record build only on the operator's explicit decision, quoting their reason."
6161
+ },
6162
+ {
6163
+ "class": "skill",
6164
+ "path": "skills/next-campaigns-os-setup/SKILL.md",
6165
+ "surface_entry": null,
6166
+ "summary": "Publish the 1.53.0+skills.2 bundle revision; read the normalized brief and the recorded decisions."
6167
+ },
6168
+ {
6169
+ "class": "skill",
6170
+ "path": "skills/next-campaigns-os/SKILL.md",
6171
+ "surface_entry": null,
6172
+ "summary": "Publish the 1.53.0+skills.2 bundle revision; return the compact brief defined in references/session-intake.md instead of a second copy, rename the Intent and Proof depth fields to Work and Proof policy, save brief answers with record brief after asking the operator, and declare a detour with --deviation-reason only when the operator has decided on it in the conversation, quoting their reason, including on record build after an input change."
6173
+ },
6174
+ {
6175
+ "class": "skill",
6176
+ "path": "skills/next-campaigns-os/references/session-intake.md",
6177
+ "surface_entry": null,
6178
+ "summary": "The single compact brief: Intent becomes Work, a Campaign field takes the Campaign intent lines from next, Missing inputs covers only choices that affect this revision, and brief answers are saved with record brief after asking the operator."
6179
+ },
6180
+ {
6181
+ "class": "skill",
6182
+ "path": "skills/next-campaigns-polish/SKILL.md",
6183
+ "surface_entry": null,
6184
+ "summary": "Publish the 1.53.0+skills.2 bundle revision; read the normalized brief and the recorded decisions; record a skipped Polish only on the operator's decision, quoting their reason as skip_reason; report readability warnings and offer repairs inside the brand palette, accepting one only with the operator's refs, reason and name."
6185
+ },
6186
+ {
6187
+ "class": "skill",
6188
+ "path": "skills/next-campaigns-qa/SKILL.md",
6189
+ "surface_entry": null,
6190
+ "summary": "Publish the 1.53.0+skills.2 bundle revision; read the normalized brief and the recorded decisions; report readability warnings and offer repairs inside the brand palette, accepting one only with the operator's refs, reason and name."
6191
+ },
6192
+ {
6193
+ "class": "cli_surface",
6194
+ "path": "src/cli.mjs",
6195
+ "surface_entry": "next",
6196
+ "summary": "next carries intent_summary on every result and prints a Campaign intent section under the status; the setup, build, Polish and QA prompts start with the summary and the absolute normalized brief path, and the build prompt names record brief and record spec for refreshing a changed brief or CampaignSpec."
6197
+ }
6198
+ ],
6199
+ "entry_sha256": "197929e76610b701b015cac7ee37f1f8a75b18e350a8268b679b8ca51a9b7f14"
6200
+ },
6201
+ {
6202
+ "id": "RL-0237",
6203
+ "sequence": 228,
6204
+ "date": "2026-10-06",
6205
+ "kind": "release",
6206
+ "surface_version": null,
6207
+ "changelog_section": "1.53.0+agent.3",
6208
+ "changelog_sha256": "d93e2a6e96de6d7e17d3f1235ff2c9ca6984890fe1026df284c38eacdbcb5557",
6209
+ "agent_impact": "standardize evaluates a campaign_cart_app root's bundled campaign-cart dependency against the SDK support policy by the lowest version its package.json spec allows, recorded as sdk_loader.bundled_dependency.floor_version. An exact pin (0.4.30, =0.4.30, v0.4.30) or one ^, ~ or >= range on a released version is evaluated by that version, unchanged from before. Any other spec (<0.4.39, an ||, hyphen or x-range, a tag) now gets no version_policy evaluation and raises the new warning version.sdk_dependency_floor_unknown; earlier releases evaluated the version written in the spec, so such a range could pass or fail the minimum on a version npm might not install. Prerelease pins still raise version.sdk_prerelease_pin only. resolved_version is unchanged.",
6210
+ "compatibility": "compatible",
6211
+ "migration": "none",
6212
+ "changes": [
6213
+ {
6214
+ "class": "named_surface",
6215
+ "path": "docs/campaign-standardization-report.md",
6216
+ "surface_entry": "docs/campaign-standardization-report.md",
6217
+ "summary": "Describe judging a bundled dependency by its floor_version, which specs have a certain floor, and the version.sdk_dependency_floor_unknown warning for those that do not."
6218
+ }
6219
+ ],
6220
+ "entry_sha256": "d98fbc7e8865f4ab5bb35bb7510a787af576ef23dfe5b50377fb2f744af8bf0b"
6221
+ },
6222
+ {
6223
+ "id": "RL-0236",
6224
+ "sequence": 229,
6225
+ "date": "2026-10-06",
6226
+ "kind": "release",
6227
+ "surface_version": null,
6228
+ "changelog_section": "1.53.0+agent.4",
6229
+ "changelog_sha256": "b1de69de9257b9151d0fb38eeb0c23f92bc8a3a405f0c0f6e6d7427b44564c75",
6230
+ "agent_impact": "doctor built_output.sdk_markup WRONG_FIELD_NAME and the standardize checkout field contract now judge first_name and last_name (mapped from Campaign Cart SDK 0.4.39) and phone_number (from 0.4.41) against the SDK version of the page: doctor reads the page's own exact loader pin, then the campaign's _data/campaigns.json sdk_version; standardize reads the file's own exact loader pin, then the lowest exact pin the campaign root declares (exact loader pins; a bundled campaign-cart dependency's exact pin or the floor of a ^, ~ or >= range, any other range reading as unknown; or for Page Kit roots the campaign's campaigns.json sdk_version). On a version at or after the name's since-version the name passes, so pages written to the SDK 0.4.41 field names stop blocking. Below it, or when no exact released version can be read, results are unchanged: first_name and last_name block (WRONG_FIELD_NAME; checkout.unsupported_field_binding) and phone_number blocks in doctor and warns as checkout.unknown_field_binding in standardize; fname, lname and phone pass on every version. WRONG_FIELD_NAME details gain sdk_version and sdk_version_source (loader or campaigns_json) and, for these three names, since; the gate gains campaign_sdk_version. standardize checkout_fields.bindings[] gain since, sdk_version and sdk_version_source (loader, campaign or campaigns_json), and stale-alias and unknown-field evidence for these names carries since and sdk_version.",
6231
+ "compatibility": "compatible",
6232
+ "migration": "none",
6233
+ "changes": [
6234
+ {
6235
+ "class": "cli_surface",
6236
+ "path": "src/doctor/checks.mjs",
6237
+ "surface_entry": "doctor",
6238
+ "summary": "The SDK markup gate passes the campaign's campaigns.json sdk_version to the field-name check as the fallback for a page with no exact loader pin, and records it as campaign_sdk_version."
6239
+ },
6240
+ {
6241
+ "class": "named_surface",
6242
+ "path": "docs/build-packet.md",
6243
+ "surface_entry": "docs/build-packet.md",
6244
+ "summary": "WRONG_FIELD_NAME: first_name and last_name are mapped from SDK 0.4.39 and phone_number from 0.4.41, judged against the page loader pin, then campaigns.json; unknown is judged as an earlier SDK."
6245
+ },
6246
+ {
6247
+ "class": "named_surface",
6248
+ "path": "docs/campaign-standardization-report.md",
6249
+ "surface_entry": "docs/campaign-standardization-report.md",
6250
+ "summary": "Describe the field contract version_gated_aliases and the sdk_version and sdk_version_source each checkout binding records. A bundled dependency counts only through an exact pin or a ^, ~ or >= floor."
6251
+ }
6252
+ ],
6253
+ "entry_sha256": "b6af3f03f0bc8e03b7a24d10c65c2cc889ede6e04ce7828b4e78c2562414564b"
6254
+ },
6255
+ {
6256
+ "id": "RL-0238",
6257
+ "sequence": 230,
6258
+ "date": "2026-10-06",
6259
+ "kind": "release",
6260
+ "surface_version": null,
6261
+ "changelog_section": "1.53.0+agent.5",
6262
+ "changelog_sha256": "69caf644546b719adf09b72227b50230250b586e6043de066dfe4b79c70c22df",
6263
+ "agent_impact": "qa run --test-order now types the test card on Campaign Cart SDK 0.4.41 checkouts. 0.4.41 mounts the card number and CVV as iframe[id^=spreedly-hosted-number] and iframe[id^=spreedly-hosted-cvv] (Spreedly Checkout SDK fields loaded by payments.29next.com/js/v1/payment.js) instead of the iFrame v1 spreedly-number-frame / spreedly-cvv-frame ids, and the runner matched only the old ids, so the typed-card step timed out before submit on 0.4.41. The runner now matches either generation. Before typing, card_fields_filled waits up to 15s until no element carries next-loading-spreedly (the SDK sets it from before the card iframes mount until the fields are ready, 0.4.38 to 0.4.41), because digits typed into a 0.4.41 field before then can be dropped, and the SDK then refuses the short number without tokenizing, so order_submitted timed out with no order. After typing, it reads both fields back and retypes, up to 3 attempts in all. The step gains evidence {generation: spreedly-hosted | spreedly-iframe-v1, number_frame_id, cvv_frame_id, ready_wait_ms, attempts}; its detail is unchanged. card_fields_filled now fails by name, with no order submitted, in three cases: when more than one number or CVV iframe matches or the two generations mix (Playwright previously raised a strict-mode violation); when next-loading-spreedly is still set after 15s, meaning the card script never finished loading; and when the fields still do not hold the typed card after 3 attempts (the error gives the digit counts and last four of the number). No verdict field or flag changes; spreedly_tokenized still reads the core.spreedly.com payment_methods request, which 0.4.41 still makes. Pages pinned to 0.4.40 or earlier run as before, plus the readiness wait and the read-back.",
6264
+ "compatibility": "additive",
6265
+ "migration": "none",
6266
+ "changes": [
6267
+ {
6268
+ "class": "named_surface",
6269
+ "path": "docs/qa-and-test-orders.md",
6270
+ "surface_entry": "docs/qa-and-test-orders.md",
6271
+ "summary": "The typed-card step names both card-field generations (Spreedly iFrame fields on SDK 0.4.40 and earlier, the Spreedly-hosted fields NEXT payments.29next.com script mounts on 0.4.41 and later), waits for next-loading-spreedly to clear before typing, and reads both fields back, retyping up to three attempts in all."
6272
+ }
6273
+ ],
6274
+ "entry_sha256": "edc4fd10bfe974dd3cfd9e6a6d5f3337a483db0525f6231bf68d3e79e22ac51f"
6275
+ },
6276
+ {
6277
+ "id": "RL-0240",
6278
+ "sequence": 231,
6279
+ "date": "2026-10-06",
6280
+ "kind": "release",
6281
+ "surface_version": null,
6282
+ "changelog_section": "1.53.0+agent.7",
6283
+ "changelog_sha256": "f91240db8674ccb5f7a94f042c93b059aa4f0a138124927b391554f554cafddc",
6284
+ "agent_impact": "doctor --built with --base-url adds a ready line saying the local built files were checked and the URL was not fetched (it only fills deploy.preview_url in the minimal Build Packet), names qa run --site <repo> --base-url <url> --family <family> --browser for the served pages, and sets derived.base_url { value, fetched: false, recorded_as: deploy.preview_url } in JSON. Do not report a doctor --built result as a check of a preview or production site.",
6285
+ "compatibility": "compatible",
6286
+ "migration": "none",
6287
+ "changes": [
6288
+ {
6289
+ "class": "cli_surface",
6290
+ "path": "src/cli.mjs",
6291
+ "surface_entry": "doctor",
6292
+ "summary": "The doctor --built usage line says --base-url is not fetched and fills deploy.preview_url in the minimal packet."
6293
+ },
6294
+ {
6295
+ "class": "cli_surface",
6296
+ "path": "src/doctor/inspect.mjs",
6297
+ "surface_entry": "doctor",
6298
+ "summary": "doctor --built with --base-url reports that only local files were checked, names qa run --site for served pages, and sets derived.base_url.fetched false."
6299
+ },
6300
+ {
6301
+ "class": "named_surface",
6302
+ "path": "docs/qa-and-test-orders.md",
6303
+ "surface_entry": "docs/qa-and-test-orders.md",
6304
+ "summary": "State that doctor --built reads local files only, that --base-url is not fetched, how to check served pages, and that the minimal packet does not drive packet QA."
6305
+ }
6306
+ ],
6307
+ "entry_sha256": "6382a67f50d12ae1999b352595ff6faa13fca3e122617e9ba43ce4cc8c77e659"
6308
+ },
6309
+ {
6310
+ "id": "RL-0241",
6311
+ "sequence": 232,
6312
+ "date": "2026-10-06",
6313
+ "kind": "release",
6314
+ "surface_version": null,
6315
+ "changelog_section": "1.53.0+agent.9",
6316
+ "changelog_sha256": "359d517828d411f329a3fe02bb421a676652ffb2662532599e435dd0cf38a5f7",
6317
+ "agent_impact": "When the per-target lock or the progress allocation lock cannot be taken because a file, a symbolic link, or a directory with no owner record that holds other entries sits at the lock path, the refusal names what is there and says it is never removed automatically. Report it as an obstruction to move out of the way, not as a busy or ownerless lock. The holder of a lock also removes staging and released siblings whose recorded owner process no longer exists.",
6318
+ "compatibility": "compatible",
6319
+ "migration": "none",
6320
+ "changes": [
6321
+ {
6322
+ "class": "named_surface",
6323
+ "path": "docs/design-source-package.md",
6324
+ "surface_entry": "docs/design-source-package.md",
6325
+ "summary": "Say that a non-lock entry at the target lock path is named and never removed, and that the holder removes lock siblings left by dead processes."
6326
+ },
6327
+ {
6328
+ "class": "named_surface",
6329
+ "path": "docs/progress-snapshots.md",
6330
+ "surface_entry": "docs/progress-snapshots.md",
6331
+ "summary": "Say that a file or other non-lock entry at the allocation lock path is named in the warning and never removed."
6332
+ }
6333
+ ],
6334
+ "entry_sha256": "82debb74a4998923dd9cfb3bea6ed486ba408860001fe79c6dc2460de026bb4a"
6335
+ },
6336
+ {
6337
+ "id": "RL-0244",
6338
+ "sequence": 233,
6339
+ "date": "2026-10-07",
6340
+ "kind": "release",
6341
+ "surface_version": null,
6342
+ "changelog_section": "1.53.0+agent.10",
6343
+ "changelog_sha256": "7b0402af57d09ba68a5ca4fc1b8e9044eafa8f2b8a3d921bf26c6803958126db",
6344
+ "agent_impact": "The vendored starter catalog and the SDK attribute index now describe Campaign Cart SDK 0.4.41. A certified family is verified against 0.4.41, so a missing SDK pin is reported against that version. built_output.sdk_markup accepts the 0.4.41 address block, data-next-i18n and phone attributes and reports sdk_attribute_index_version 0.4.41; built_output.cart_placeholders checks pages pinned to 0.4.41 instead of reporting them unexercised. Read a WRONG_FIELD_NAME finding as naming the 0.4.41 field set, which is the same as 0.4.38 plus the version-gated aliases.",
6345
+ "compatibility": "compatible",
6346
+ "migration": "none",
6347
+ "changes": [
6348
+ {
6349
+ "class": "named_surface",
6350
+ "path": "docs/build-packet.md",
6351
+ "surface_entry": "docs/build-packet.md",
6352
+ "summary": "Say the vendored checkout field names are taken at SDK v0.4.41."
6353
+ }
6354
+ ],
6355
+ "entry_sha256": "41994901ffbce1dbdf74e020465ba9622ed062cb310b6021265fe848ae12a559"
6356
+ },
6357
+ {
6358
+ "id": "RL-0245",
6359
+ "sequence": 234,
6360
+ "date": "2026-10-07",
6361
+ "kind": "release",
6362
+ "surface_version": "1.54.0",
6363
+ "changelog_section": "1.54.0",
6364
+ "changelog_sha256": "60ec528377c8a9f14165cfd7d6e09a4e7933c65cd53c6ca3fe8f74ff7acbe91d",
6365
+ "agent_impact": "Surface 1.54.0. Ships 1.53.0+agent.1 through +agent.11, including qa run --test-order typing card fields on Campaign Cart SDK 0.4.41 and the starter catalog, SDK attribute index and support policy at 0.4.41. New subcommand sdk repin --target <static-repo> [--target-sdk <x.y.z>] [--apply] [--json] replaces the hand-run sed step when bumping the Campaign Cart SDK in a static campaign repo (no _data/campaigns.json). It rewrites only the version segment of semver-pinned (@vX.Y.Z or @X.Y.Z) loader.js and campaign-cart.css URLs below the target, the same references standardize lists under sdk_loader.references; @latest, @main, commit and prerelease refs and pins at or above the target are reported in left_alone and never rewritten. The target defaults to the SDK support policy's preferred_minimum. Preview is the default and writes nothing; --apply writes the files and the change record .campaign-runtime/sdk-repin.json (schema campaigns-os-sdk-repin/v0: files_touched, reference_count, from_versions, to_version, rewrites, left_alone), whose path and sha256 the --json result gives for a Run Record to cite. A second run reports nothing_to_change and writes nothing. A page-kit repo is refused with exit 2 (status refused_page_kit); use page-kit sync there. After --apply, run browser QA against the new pin: repin does not prove the SDK works. qa run keeps the verdict local by default when the base URL (from --base-url or the packet's deploy.preview_url) is a local address (localhost or *.localhost, any 127.x.x.x, 0.0.0.0, [::1] or an IPv4-mapped loopback), for saved-Map and local-spec runs alike; publish_decision.reason reads loopback_base_url and the output names qa publish and --post-verdict. An agent that wants a local-address verdict on the Map's QA tab passes --post-verdict or runs qa publish afterwards. Remote base URLs publish as before. record deploy now binds stages.deploy to the build it probed (source_build_fingerprint). After a record build of different output, a stamped deploy reads required and next names deploy before QA: serve the new build and run record deploy again. A byte-identical rebuild keeps the deploy current, and a deploy recorded before this change, with no stamp, is kept as recorded.",
6366
+ "compatibility": "compatible",
6367
+ "migration": "none",
6368
+ "changes": [
6369
+ {
6370
+ "class": "compatibility_policy",
6371
+ "path": "compatibility.json",
6372
+ "surface_entry": null,
6373
+ "summary": "Advance the declared version to 1.54.0."
6374
+ },
6375
+ {
6376
+ "class": "compatibility_policy",
6377
+ "path": "contracts/effects.v1.json",
6378
+ "surface_entry": "contracts/effects.v1.json",
6379
+ "summary": "Declare sdk repin (tier none) and sdk repin --apply (tier B: the rewritten files, the change record and the lifecycle journal), and add --apply to the effect-changing flags; on the eight qa run rows, name the local-address default in the verdict send's condition and record it unobserved under the 127.0.0.1 offline fixture (#486), with qa publish as the proof of that send; state that record deploy stamps the build fingerprint it probed, and that record build makes a completed deploy stamped with other output required."
6380
+ },
6381
+ {
6382
+ "class": "compatibility_policy",
6383
+ "path": "contracts/supported-surface.json",
6384
+ "surface_entry": "contracts/supported-surface.json",
6385
+ "summary": "Advance surface_version to 1.54.0 and record the effects contract and Assembly Report schema hashes."
6386
+ },
6387
+ {
6388
+ "class": "cli_surface",
6389
+ "path": "src/cli.mjs",
6390
+ "surface_entry": "sdk",
6391
+ "summary": "Add the sdk repin subcommand and its usage line: rewrite semver-pinned Campaign Cart loader and stylesheet URLs below the target in a static repo, preview by default, --apply writes the files and the campaigns-os-sdk-repin/v0 change record, --target-sdk overrides the policy target, a page-kit repo is refused with exit 2; the record deploy usage line says the deploy stage carries the build fingerprint it probed and is required again after a record build of other output."
6392
+ },
6393
+ {
6394
+ "class": "compatibility_policy",
6395
+ "path": "docs/supported-surface.md",
6396
+ "surface_entry": "docs/supported-surface.md",
6397
+ "summary": "Add the sdk repin row."
6398
+ },
6399
+ {
6400
+ "class": "named_surface",
6401
+ "path": "docs/sdk-storage-compatibility.md",
6402
+ "surface_entry": "docs/sdk-storage-compatibility.md",
6403
+ "summary": "Document sdk repin as the pin-rewrite step after the storage check for static repos: which references it rewrites and leaves alone, the preview and --apply modes, the change record, and the page-kit refusal."
6404
+ },
6405
+ {
6406
+ "class": "named_surface",
6407
+ "path": "docs/effects.md",
6408
+ "surface_entry": "docs/effects.md",
6409
+ "summary": "List the sdk repin preview among the read-only invocations and --apply among the effect-changing flags."
6410
+ },
6411
+ {
6412
+ "class": "named_surface",
6413
+ "path": "docs/campaign-standardization-report.md",
6414
+ "surface_entry": "docs/campaign-standardization-report.md",
6415
+ "summary": "Point from sdk_loader.references to sdk repin for static repos."
6416
+ },
6417
+ {
6418
+ "class": "named_surface",
6419
+ "path": "docs/qa-and-test-orders.md",
6420
+ "surface_entry": "docs/qa-and-test-orders.md",
6421
+ "summary": "Describe the local-address default and how to publish such a verdict; the local proof steps say record deploy is bound to the build it probed and is owed again after a record build of other output."
6422
+ },
6423
+ {
6424
+ "class": "named_surface",
6425
+ "path": "docs/local-setup.md",
6426
+ "surface_entry": "docs/local-setup.md",
6427
+ "summary": "Pin the 1.54.0 package in the local setup install command."
6428
+ },
6429
+ {
6430
+ "class": "named_surface",
6431
+ "path": "docs/skills-revision.md",
6432
+ "surface_entry": "docs/skills-revision.md",
6433
+ "summary": "Use the current 1.54.0+skills.1 bundle in executable examples."
6434
+ },
6435
+ {
6436
+ "class": "package_export",
6437
+ "path": "package.json",
6438
+ "surface_entry": null,
6439
+ "summary": "Advance the package version to 1.54.0."
6440
+ },
6441
+ {
6442
+ "class": "skill",
6443
+ "path": "skills.json",
6444
+ "surface_entry": "skills.json",
6445
+ "summary": "Advance the bundled skill revision to 1.54.0+skills.1 and each skill version one patch."
6446
+ },
6447
+ {
6448
+ "class": "skill",
6449
+ "path": "skills/campaign-lifecycle-orientation/SKILL.md",
6450
+ "surface_entry": null,
6451
+ "summary": "Publish the 1.54.0+skills.1 bundle revision."
6452
+ },
6453
+ {
6454
+ "class": "skill",
6455
+ "path": "skills/campaign-readback-classification/SKILL.md",
6456
+ "surface_entry": null,
6457
+ "summary": "Publish the 1.54.0+skills.1 bundle revision."
6458
+ },
6459
+ {
6460
+ "class": "skill",
6461
+ "path": "skills/campaign-run-evidence/SKILL.md",
6462
+ "surface_entry": null,
6463
+ "summary": "Publish the 1.54.0+skills.1 bundle revision."
6464
+ },
6465
+ {
6466
+ "class": "skill",
6467
+ "path": "skills/contribution-intake/SKILL.md",
6468
+ "surface_entry": null,
6469
+ "summary": "Publish the 1.54.0+skills.1 bundle revision."
6470
+ },
6471
+ {
6472
+ "class": "skill",
6473
+ "path": "skills/next-campaigns-build/SKILL.md",
6474
+ "surface_entry": null,
6475
+ "summary": "Publish the 1.54.0+skills.1 bundle revision."
6476
+ },
6477
+ {
6478
+ "class": "skill",
6479
+ "path": "skills/next-campaigns-os-setup/SKILL.md",
6480
+ "surface_entry": null,
6481
+ "summary": "Publish the 1.54.0+skills.1 bundle revision."
6482
+ },
6483
+ {
6484
+ "class": "skill",
6485
+ "path": "skills/next-campaigns-os/SKILL.md",
6486
+ "surface_entry": null,
6487
+ "summary": "Publish the 1.54.0+skills.1 bundle revision."
6488
+ },
6489
+ {
6490
+ "class": "skill",
6491
+ "path": "skills/next-campaigns-polish/SKILL.md",
6492
+ "surface_entry": null,
6493
+ "summary": "Publish the 1.54.0+skills.1 bundle revision."
6494
+ },
6495
+ {
6496
+ "class": "skill",
6497
+ "path": "skills/next-campaigns-qa/SKILL.md",
6498
+ "surface_entry": null,
6499
+ "summary": "Publish the 1.54.0+skills.1 bundle revision."
6500
+ },
6501
+ {
6502
+ "class": "documentation",
6503
+ "path": "docs/orientation-contract-reference.md",
6504
+ "surface_entry": "docs/orientation-contract-reference.md",
6505
+ "summary": "Regenerate at surface 1.54.0."
6506
+ },
6507
+ {
6508
+ "class": "named_surface",
6509
+ "path": "docs/runtime-readiness.md",
6510
+ "surface_entry": "docs/runtime-readiness.md",
6511
+ "summary": "Regenerate at surface 1.54.0."
6512
+ },
6513
+ {
6514
+ "class": "generated_runtime",
6515
+ "path": "package-lock.json",
6516
+ "surface_entry": null,
6517
+ "summary": "Advance the package version to 1.54.0."
6518
+ },
6519
+ {
6520
+ "class": "schema",
6521
+ "path": "schemas/campaign-runtime-assembly-report.v0.schema.json",
6522
+ "surface_entry": "schemas/campaign-runtime-assembly-report.v0.schema.json",
6523
+ "summary": "Describe source_build_fingerprint on a stage, which stages.deploy now carries: the build fingerprint record deploy probed."
6524
+ },
6525
+ {
6526
+ "class": "named_surface",
6527
+ "path": "docs/build-packet.md",
6528
+ "surface_entry": "docs/build-packet.md",
6529
+ "summary": "The record build and record deploy rows say deploy is stamped with the build it probed and reset to required by a record build of other output; an unstamped deploy is kept."
6530
+ }
6531
+ ],
6532
+ "entry_sha256": "5ab33ca302fa671ac78c3e9b752ed7b251e756b05256f97ff75acd08c58ad5ba"
5873
6533
  }
5874
6534
  ]
5875
6535
  }