@nextcommerce/campaigns-os 1.53.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.
- package/CHANGELOG.md +61 -0
- package/README.md +1 -0
- package/compatibility.json +1 -1
- package/contracts/campaign-cart-checkout-field-contract.v0.json +10 -0
- package/contracts/campaign-cart-sdk-support-policy.v0.json +2 -2
- package/contracts/commerce-surface-catalog.json +27 -27
- package/contracts/effects.v1.json +96 -37
- package/contracts/release-ledger.json +333 -0
- package/contracts/supported-surface.json +3 -3
- package/contracts/template-brand-contract.shared-commerce.v0.json +1 -1
- package/docs/build-packet.md +11 -4
- package/docs/campaign-standardization-report.md +32 -0
- package/docs/design-source-package.md +7 -3
- package/docs/effects.md +2 -1
- package/docs/local-setup.md +1 -1
- package/docs/orientation-contract-reference.md +1 -1
- package/docs/progress-snapshots.md +3 -1
- package/docs/qa-and-test-orders.md +28 -3
- package/docs/runtime-readiness.md +1 -1
- package/docs/sdk-storage-compatibility.md +15 -0
- package/docs/skills-revision.md +10 -10
- package/docs/supported-surface.md +1 -0
- package/package.json +1 -1
- package/schemas/campaign-runtime-assembly-report.v0.schema.json +5 -1
- package/skills/campaign-lifecycle-orientation/SKILL.md +3 -3
- package/skills/campaign-readback-classification/SKILL.md +3 -3
- package/skills/campaign-run-evidence/SKILL.md +3 -3
- package/skills/contribution-intake/SKILL.md +3 -3
- package/skills/next-campaigns-build/SKILL.md +3 -3
- package/skills/next-campaigns-os/SKILL.md +3 -3
- package/skills/next-campaigns-os-setup/SKILL.md +3 -3
- package/skills/next-campaigns-polish/SKILL.md +3 -3
- package/skills/next-campaigns-qa/SKILL.md +3 -3
- package/skills.json +10 -10
- package/src/campaign-ecosystem.mjs +153 -31
- package/src/cli.mjs +22 -3
- package/src/directory-lock.mjs +79 -7
- package/src/doctor/checks.mjs +12 -2
- package/src/doctor/inspect.mjs +13 -0
- package/src/invocation.mjs +3 -1
- package/src/progress-node.mjs +3 -2
- package/src/qa-browser.mjs +80 -9
- package/src/qa-node.mjs +33 -4
- package/src/sdk-attribute-index.mjs +111 -23
- package/src/sdk-markup.mjs +49 -10
- package/src/sdk-repin.mjs +282 -0
- package/src/stage-ledger.mjs +1 -1
- package/src/stage-record.mjs +37 -6
- package/src/standardization-report.mjs +26 -1
- package/src/target-lock.mjs +9 -1
|
@@ -6197,6 +6197,339 @@
|
|
|
6197
6197
|
}
|
|
6198
6198
|
],
|
|
6199
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"
|
|
6200
6533
|
}
|
|
6201
6534
|
]
|
|
6202
6535
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_note": "The downstream contract manifest. Everything listed here is SUPPORTED SURFACE: consumers (campaigns-agent, campaign-builder, the private ops repo, page-kit campaign repos) may depend on it, and changing it is a deliberate act — hashed entries require a surface_version bump in the same change (check-supported-surface.mjs --base, mirroring the skills.json bump gate), named entries must keep existing at their path, cli_commands must keep resolving in the CLI dispatch, package_exports must stay exported, and every entry must ship in the npm pack (files[] coverage). Anything NOT listed here — src/** internals, scripts/** checkers, examples/**, prompts/**, contracts/** other than this file and the entries named[] below (the orientation contract, the release ledger, and the consumer-facing orientation fixtures) — is implementation: consumers may read it for context but must not build on it, and it can change without notice. Rationale and the compatibility promise: docs/supported-surface.md.",
|
|
3
|
-
"surface_version": "1.
|
|
3
|
+
"surface_version": "1.54.0",
|
|
4
4
|
"package_exports": [
|
|
5
5
|
"./commercial-journey",
|
|
6
6
|
"./commercial-parity",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"sha256": "65bcd8b5f41f1e9ecfc36f3b8838cd4ed531bd74c5a318ee5147131f6c9b4a1c"
|
|
61
61
|
},
|
|
62
62
|
"schemas/campaign-runtime-assembly-report.v0.schema.json": {
|
|
63
|
-
"sha256": "
|
|
63
|
+
"sha256": "625a6f2ed6bee726f9cddad750e64a54a7e03744c777f5a70afe4a39afdd9848"
|
|
64
64
|
},
|
|
65
65
|
"schemas/campaign-runtime-build-context.v0.schema.json": {
|
|
66
66
|
"sha256": "f310c1b7844d9b1994864d15858ff0c6f17efc1e5285ba193d181bdb2dd4be2f"
|
|
@@ -120,7 +120,7 @@
|
|
|
120
120
|
"sha256": "dfc9abed38d456969e47a21f606d308a03bdf036f3466f7d6e47a602747dacf4"
|
|
121
121
|
},
|
|
122
122
|
"contracts/effects.v1.json": {
|
|
123
|
-
"sha256": "
|
|
123
|
+
"sha256": "10a9020aaba5780e2ee2f3ddf6d81127047f6caec0de774c48540d9b664e0a6a"
|
|
124
124
|
},
|
|
125
125
|
"schemas/campaigns-os-effects.v1.schema.json": {
|
|
126
126
|
"sha256": "3eadd22169ab98bc7c2f682af2751267605170581182158d96be035b0cfe44dc"
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
},
|
|
56
56
|
"asset_pin": {
|
|
57
57
|
"repo": "NextCommerceCo/campaign-cart-starter-templates",
|
|
58
|
-
"sha": "
|
|
58
|
+
"sha": "783329017c6994a94d11e46580c33bd052aabdb0",
|
|
59
59
|
"path": "src/<family>/assets/<asset>",
|
|
60
60
|
"note": "asset_sha256 is the sha256 of each shipped starter asset at this commit (the commerce-surface-catalog _synced_from_sha pin; the bytes are identical across every family). A served asset whose bytes hash to the shipped value is the untouched starter asset and counts as residue even though its markup names no method; different bytes mean it was edited in place. check-template-doctrine verifies these hashes against the pinned checkout."
|
|
61
61
|
},
|
package/docs/build-packet.md
CHANGED
|
@@ -827,12 +827,19 @@ Blockers (not waivable — the markup provably does not do what it says):
|
|
|
827
827
|
- `CHECKOUT_NOT_FORM` — `data-next-checkout` on an element that is not `<form>`.
|
|
828
828
|
- `WRONG_FIELD_NAME` — `data-next-checkout-field` with a value the SDK does not
|
|
829
829
|
map. The set is vendored from the SDK at a named tag
|
|
830
|
-
(`src/sdk-attribute-index.mjs`, currently v0.4.
|
|
830
|
+
(`src/sdk-attribute-index.mjs`, currently v0.4.41: `email`, `fname`, `lname`,
|
|
831
831
|
`phone`, `address1`, `address2`, `city`, `province`, `postal`, `country`,
|
|
832
832
|
`payment-method`, `accepts_marketing`, `cc-number`, `cc-month`, `cc-year`,
|
|
833
833
|
`exp-month`, `exp-year`, `cvv`, the legacy `card-*` spellings, and any
|
|
834
834
|
`billing-` prefixed name). The message names the SDK spelling for the usual
|
|
835
|
-
offenders (`firstName` → `fname`, `zip` → `postal`).
|
|
835
|
+
offenders (`firstName` → `fname`, `zip` → `postal`). Three names depend on
|
|
836
|
+
the page's SDK version: `first_name` and `last_name` are mapped from v0.4.39
|
|
837
|
+
and `phone_number` from v0.4.41. The version is the page's own exact loader
|
|
838
|
+
pin, else the campaign's `sdk_version` in `_data/campaigns.json`. Below the
|
|
839
|
+
name's version, or when neither gives an exact released version, the name
|
|
840
|
+
blocks, and the message names `fname`, `lname` or `phone`, which every
|
|
841
|
+
version maps. Each finding carries `sdk_version` and `sdk_version_source`
|
|
842
|
+
(`loader` or `campaigns_json`) in its detail.
|
|
836
843
|
- `MISSING_SELECTOR_ID_MATCH` — an `add-to-cart` button whose
|
|
837
844
|
`data-next-selector-id` names no selector on the page (an element that is a
|
|
838
845
|
bundle, package, cart or upsell selector; another element echoing the id
|
|
@@ -1730,10 +1737,10 @@ hand-editing `.campaign-runtime/` JSON:
|
|
|
1730
1737
|
| Command | Writes | Refused (nothing written) when |
|
|
1731
1738
|
|---|---|---|
|
|
1732
1739
|
| `campaigns-os record setup --packet <p>` | Build Context `scaffold.required=false` (`handoff_skill` next-campaigns-build) and `stages.setup` completed | the campaign output directory (`assembly.output_dir`) does not exist, or there is no Build Context or Assembly Report |
|
|
1733
|
-
| `campaigns-os record build --packet <p> [--build-environment <development\|production>]` | `stages.assembly` completed with `build_fingerprint` = doctor's `derived.build_output_fingerprint.value`, `source_package_material_fingerprint` = the report's Design Source Package material fingerprint when present, `evidence.build_environment` = the `--build-environment` value when given (kept from the last record otherwise), and `stages.polish` reset to `required` (`required_by` build, `required_for` qa) unless its evidence is bound to this exact output | doctor cannot compute the fingerprint (no `_site/<public_route_slug>/`), setup is still required, or `stages.setup` is not terminal |
|
|
1740
|
+
| `campaigns-os record build --packet <p> [--build-environment <development\|production>]` | `stages.assembly` completed with `build_fingerprint` = doctor's `derived.build_output_fingerprint.value`, `source_package_material_fingerprint` = the report's Design Source Package material fingerprint when present, `evidence.build_environment` = the `--build-environment` value when given (kept from the last record otherwise), and `stages.polish` reset to `required` (`required_by` build, `required_for` qa) unless its evidence is bound to this exact output; a completed `stages.deploy` whose `source_build_fingerprint` names other output is reset to `required` the same way, without the old probe's `outputs` and `evidence`, and its prior record is kept in `stages.deploy.history` (a deploy with no `source_build_fingerprint`, recorded before deploy stamped it, is kept) | doctor cannot compute the fingerprint (no `_site/<public_route_slug>/`), setup is still required, or `stages.setup` is not terminal |
|
|
1734
1741
|
| `campaigns-os record polish --packet <p> --evidence <file>` | `stages.polish` from the file (`docs/polish-evidence.md` §7: completed, blocked or skipped), bound to doctor's current fingerprint; `report.theme.repair_loop_defect` when the file sets it | build is not recorded for the current output, the file has a shape error (named by field), or, for a completed status, the polish gate doctor evaluates would not pass on the result |
|
|
1735
1742
|
| `campaigns-os record theme --packet <p>` | `report.theme`: status `applied`, `load_order` `after-next-core`, `css_path`, `commerce_pages` and per-page evidence read from each built commerce page's stylesheet links; any earlier theme waiver is cleared | build is not recorded for the current output, the campaign ships no commerce pages, a built commerce page that loads `next-core.css` does not load `brand-theme.css` (or `checkout-brand.css`) after it or links one missing from the built output, or no built commerce page loads `next-core.css` |
|
|
1736
|
-
| `campaigns-os record deploy --packet <p> --base-url <url>` | the packet's `deploy.preview_url` and `stages.deploy` completed with the URL in `outputs
|
|
1743
|
+
| `campaigns-os record deploy --packet <p> --base-url <url>` | the packet's `deploy.preview_url` and `stages.deploy` completed with the URL in `outputs`, one evidence line per built page that answered (each page is requested under the URL first), and `source_build_fingerprint` = the recorded `stages.assembly.build_fingerprint` it probed, so a later `record build` of different output makes deploy owed again and `next` routes back to `record deploy` before QA; a byte-identical rebuild keeps it current | the packet is not `local-serve`, the URL is not a loopback origin naming the campaign's route root, a built page does not answer 2xx, polish is not recorded, the built output changed since build was recorded, or the theme gate is blocked |
|
|
1737
1744
|
|
|
1738
1745
|
Each command also refuses a stage `next` has not reached: while doctor's
|
|
1739
1746
|
prepare-build gate is set (`next` answers prepare-build) or while an earlier
|
|
@@ -170,12 +170,34 @@ version discovery), `checkout_fields` (every
|
|
|
170
170
|
script evidence, and `proof_state`), `runtime_contract`, `findings`, and
|
|
171
171
|
`remediation`.
|
|
172
172
|
|
|
173
|
+
Three names in the field contract depend on the SDK version
|
|
174
|
+
(`version_gated_aliases`): `first_name` and `last_name` from 0.4.39 and
|
|
175
|
+
`phone_number` from 0.4.41. Each is `supported` only when the binding's SDK
|
|
176
|
+
version is an exact release at or after that version; otherwise it is
|
|
177
|
+
classified as on an earlier SDK (`first_name` and `last_name` as stale aliases,
|
|
178
|
+
`phone_number` as unknown). Each binding records the `sdk_version` it was
|
|
179
|
+
judged against and its `sdk_version_source`: `loader` (the file's own exact
|
|
180
|
+
loader pin), `campaign` (for a file with no loader of its own, the lowest of
|
|
181
|
+
the root's exact loader pins and its bundled dependency's floor: an exact pin,
|
|
182
|
+
or `^`, `~` or `>=` on a released version; any other range leaves the version
|
|
183
|
+
unknown), or
|
|
184
|
+
`campaigns_json` (a Page Kit campaign's `sdk_version`; a shared file takes the
|
|
185
|
+
lowest across campaigns). An unpinned loader or a missing pin leaves
|
|
186
|
+
`sdk_version` null, judged as an earlier SDK, because `fname`, `lname` and
|
|
187
|
+
`phone` work on every version.
|
|
188
|
+
|
|
173
189
|
`sdk_loader.references` records pinned and unpinned loader refs alike
|
|
174
190
|
(`version` is null for `@latest`/branch/commit pins, which raise
|
|
175
191
|
`version.sdk_loader_unpinned` instead of a policy evaluation). Only URLs that
|
|
176
192
|
point at a loader/dist artifact count; incidental `campaign-cart@x.y.z`
|
|
177
193
|
strings elsewhere in source are ignored.
|
|
178
194
|
|
|
195
|
+
In a static repo (no `_data/campaigns.json`), `campaigns-os sdk repin --target
|
|
196
|
+
<repo> [--target-sdk <x.y.z>] [--apply]` rewrites the semver-pinned references
|
|
197
|
+
in this list that are below the target version, changing only the version
|
|
198
|
+
segment of each URL. It previews by default and leaves the unpinned refs
|
|
199
|
+
alone. See `sdk-storage-compatibility.md`.
|
|
200
|
+
|
|
179
201
|
`payment.proof_state` is one of `runtime_proof_required` (custom-control
|
|
180
202
|
evidence found), `undetermined` (radios exist; static scanning cannot exclude
|
|
181
203
|
externally-styled custom controls), or `not_applicable` (no `payment_method`
|
|
@@ -216,6 +238,16 @@ Page Kit root that inlines them gets the same `checkout_fields` block and the
|
|
|
216
238
|
same `checkout.unsupported_field_binding` / `checkout.unknown_field_binding`
|
|
217
239
|
findings as an application root.
|
|
218
240
|
|
|
241
|
+
A bundled dependency is judged by its floor, the lowest version its
|
|
242
|
+
`package.json` spec lets npm install, recorded as
|
|
243
|
+
`sdk_loader.bundled_dependency.floor_version`. Only an exact pin (`0.4.30`,
|
|
244
|
+
`=0.4.30`, `v0.4.30`) or one `^`, `~` or `>=` range on a released version has
|
|
245
|
+
a certain floor; `^0.4.25` is evaluated as `0.4.25`. Any other spec (`<0.4.39`,
|
|
246
|
+
an `||`, hyphen or x-range, a tag) has none, so it gets no evaluation and
|
|
247
|
+
raises the warning `version.sdk_dependency_floor_unknown` instead; a
|
|
248
|
+
prerelease pin raises `version.sdk_prerelease_pin`. `resolved_version` stays
|
|
249
|
+
the version text extracted from the spec, for reference.
|
|
250
|
+
|
|
219
251
|
Both are also injectable from the CLI: pass
|
|
220
252
|
`--sdk-support-policy <path-to-json>` and/or `--field-contract <path-to-json>`
|
|
221
253
|
to `standardize`. Each file is read and JSON-parsed
|
|
@@ -396,9 +396,13 @@ a minute. The lock directory and its owner record appear together, so a lock
|
|
|
396
396
|
left by a process that died is recovered automatically, and a lock directory
|
|
397
397
|
without an owner record (only an older release leaves one) is never taken
|
|
398
398
|
over: the command refuses it after about a second and names it. Confirm no
|
|
399
|
-
campaigns-os process is working on the target, then remove it.
|
|
400
|
-
|
|
401
|
-
|
|
399
|
+
campaigns-os process is working on the target, then remove it. Anything else
|
|
400
|
+
at the lock path (a file, a symbolic link, or a directory with no owner record
|
|
401
|
+
that holds other entries) is not a lock: once the wait ends the command names
|
|
402
|
+
what is there and never removes it. The holder of the lock removes staging and
|
|
403
|
+
released directories beside it whose recorded owner process no longer exists.
|
|
404
|
+
Do not run an older Campaigns OS release against the same target at the same
|
|
405
|
+
time. A waiver's `--dry-run` preview takes no lock.
|
|
402
406
|
|
|
403
407
|
Before writing any output, `prepare-build` also requires distinct paths for the
|
|
404
408
|
Build Packet, Build Context, Assembly Report, Doctor output, normalized Build
|
package/docs/effects.md
CHANGED
|
@@ -42,6 +42,7 @@ CLI exempts from lifecycle capture (the converse does not hold: `demo` and the
|
|
|
42
42
|
`doctor` inspection and `doctor --no-write` skip it and write nothing but may
|
|
43
43
|
send the one live campaign read): `help`, `readback`,
|
|
44
44
|
`run status`, `doctor --no-live-refs` inspection, `sdk storage-check`,
|
|
45
|
+
the `sdk repin` preview (without `--apply`),
|
|
45
46
|
`tooling diagnose`, a refused invocation, `run-record --no-write`, and every
|
|
46
47
|
`--dry-run` form on the commands that implement the flag. Everything else
|
|
47
48
|
appends an entry when a journal is selected — an active run session,
|
|
@@ -160,7 +161,7 @@ Both rows are tier C, because a change makes recorded stages owed again, and eac
|
|
|
160
161
|
|
|
161
162
|
There is **one row per command and per effect-changing flag combination**. The
|
|
162
163
|
flags that change what the invocation does to the world are listed once, in
|
|
163
|
-
`vocabulary.effect_changing_flags`: `--browser`, `--built`, `--dry-run`,
|
|
164
|
+
`vocabulary.effect_changing_flags`: `--apply`, `--browser`, `--built`, `--dry-run`,
|
|
164
165
|
`--emit-packet`, `--example`, `--force`, `--from-store`, `--list`,
|
|
165
166
|
`--no-live-refs`, `--no-post-verdict`, `--no-probe`, `--no-remit`, `--no-run-session`,
|
|
166
167
|
`--no-write`, `--republish`, `--test-order`, `--write`, `--write-map`. Flags
|
package/docs/local-setup.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
For a new campaign, create an empty working folder and run this from it:
|
|
4
4
|
|
|
5
5
|
```sh
|
|
6
|
-
npm init -y && npm install --save-exact next-campaign-page-kit@0.2.0 && npm install --save-dev --save-exact @nextcommerce/campaigns-os@1.
|
|
6
|
+
npm init -y && npm install --save-exact next-campaign-page-kit@0.2.0 && npm install --save-dev --save-exact @nextcommerce/campaigns-os@1.54.0 && npx --no-install campaigns-os tooling setup --target . --platform claude
|
|
7
7
|
```
|
|
8
8
|
|
|
9
9
|
`npm init -y` gives the folder its own `package.json`. Without one, npm
|
|
@@ -26,7 +26,7 @@ Ledger schema id: `campaigns-os-release-ledger/v1`
|
|
|
26
26
|
Change policy version: `1.0.0`
|
|
27
27
|
Reason-code vocabulary version: `1.0.0`
|
|
28
28
|
Limits version: `1.0.0`
|
|
29
|
-
Supported surface at generation time: `1.
|
|
29
|
+
Supported surface at generation time: `1.54.0`
|
|
30
30
|
|
|
31
31
|
## Forward compatibility
|
|
32
32
|
|
|
@@ -65,7 +65,9 @@ rename; a live process is never evicted. A lock directory with no owner record
|
|
|
65
65
|
a second. If one is found, or if recovery itself is interrupted, capture fails
|
|
66
66
|
closed and the warning names the affected `.allocation-lock` directory: stop
|
|
67
67
|
all Campaigns OS writers for that target, then remove that directory before
|
|
68
|
-
retrying `next`.
|
|
68
|
+
retrying `next`. A file or other non-lock entry at the lock path is named in
|
|
69
|
+
the warning and never removed: move it out of the way. Do not remove a lock
|
|
70
|
+
while a writer is active. Do not run an
|
|
69
71
|
older Campaigns OS release against the same target at the same time.
|
|
70
72
|
|
|
71
73
|
An unchanged projection reuses its ID, timestamp and sequence. Identity
|
|
@@ -59,8 +59,10 @@ the toolkit runs that loop in a fixed order:
|
|
|
59
59
|
2. **Serve and prove.** Serve `_site/` on localhost (the `next deploy` handoff
|
|
60
60
|
names the directory and any root-route rewrite) and run `polish capture`
|
|
61
61
|
against it. Once polish is recorded, `record deploy --packet <p> --base-url
|
|
62
|
-
<url>` records the URL on `deploy.preview_url` and the deploy stage
|
|
63
|
-
|
|
62
|
+
<url>` records the URL on `deploy.preview_url` and the deploy stage, bound
|
|
63
|
+
to the build it probed (a `record build` of different output makes it owed
|
|
64
|
+
again and keeps the old record in the deploy stage's history); then run `qa run --browser` and the typed-card order paths against
|
|
65
|
+
it.
|
|
64
66
|
3. **Prove the pin on the production output.** Before committing, run
|
|
65
67
|
|
|
66
68
|
```bash
|
|
@@ -726,6 +728,16 @@ spec resolved from the portal for the run — keep publish-by-default regardless
|
|
|
726
728
|
of consent: those verdicts are the QA tab's product surface, not telemetry.
|
|
727
729
|
Explicit flags always win in both directions for saved-Map QA.
|
|
728
730
|
|
|
731
|
+
A run whose base URL is a local address (`localhost` or any `*.localhost`
|
|
732
|
+
name, any `127.x.x.x` address, `0.0.0.0`, `[::1]` or an IPv4-mapped loopback,
|
|
733
|
+
from `--base-url` or the packet's `deploy.preview_url`) keeps its verdict local
|
|
734
|
+
by default, whatever the spec source. Those runs are checks on your own
|
|
735
|
+
machine, and people watching the Map's QA tab should not see them. The output
|
|
736
|
+
names the destination and how to publish: `qa publish` for the stored verdict,
|
|
737
|
+
or `--post-verdict` on the next run. `--post-verdict` publishes a local-address
|
|
738
|
+
run, and `publish_decision.reason` reads `loopback_base_url` when the default
|
|
739
|
+
kept it local.
|
|
740
|
+
|
|
729
741
|
A packet with `local_spec_id` always keeps its verdict and progress local.
|
|
730
742
|
`qa run` suppresses portal publication even with `--post-verdict`; the flag
|
|
731
743
|
does not turn a local ID into a Map destination. `qa publish` refuses such a
|
|
@@ -1810,7 +1822,12 @@ The browser driver intentionally behaves like a user:
|
|
|
1810
1822
|
proven against the persisted-order voucher read-back
|
|
1811
1823
|
- checkout is advanced through the visible cart/checkout button
|
|
1812
1824
|
- address autocomplete is settled or closed before submit
|
|
1813
|
-
-
|
|
1825
|
+
- the card and CVV iframes are filled with sequential keystrokes: Spreedly's
|
|
1826
|
+
iFrame fields on SDK 0.4.40 and earlier, and on 0.4.41 and later the
|
|
1827
|
+
Spreedly-hosted fields that NEXT's `payments.29next.com` script mounts.
|
|
1828
|
+
Typing starts once the checkout form drops `next-loading-spreedly` (the
|
|
1829
|
+
fields are ready), and both fields are read back and retyped, up to three
|
|
1830
|
+
attempts in all, before `card_fields_filled` passes
|
|
1814
1831
|
- the real submit button is clicked without fabricating SDK state
|
|
1815
1832
|
|
|
1816
1833
|
The intended QA order matrix is:
|
|
@@ -1962,6 +1979,14 @@ placeholder-text blocker and the other residue gates still run. The emitted
|
|
|
1962
1979
|
minimal packet is marked `_synthesized` — it points doctor/QA at the built
|
|
1963
1980
|
output and family, and is not a substitute for a real Build Packet.
|
|
1964
1981
|
|
|
1982
|
+
`doctor --built` reads the local built files only. `--base-url` is not
|
|
1983
|
+
fetched: it fills `deploy.preview_url` in the minimal packet, and the output
|
|
1984
|
+
says so (`derived.base_url.fetched: false` in JSON). A clean `doctor --built`
|
|
1985
|
+
run with a preview URL says nothing about the preview. To check the served
|
|
1986
|
+
pages, run `qa run --site <repo> --base-url <url> --family <family> --browser`.
|
|
1987
|
+
The emitted minimal packet does not drive packet QA: `qa resolve` and
|
|
1988
|
+
`qa run --packet` block on it, because it carries no local CampaignSpec.
|
|
1989
|
+
|
|
1965
1990
|
**Trade-off — non-packet QA is narrower than packet-driven QA.** It runs the
|
|
1966
1991
|
built-output gates (residue, placeholder text, demo-asset, pricing-CSS, brand
|
|
1967
1992
|
contract) but **skips the CampaignSpec/source-HTML-driven checks** a packet
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
How a checkout of this repository at one commit becomes a usable installed runtime, and how a consumer decides whether a prepared one is still trustworthy. Everything below is generated from `contracts/runtime-recipe.campaigns-os-node-v1.json`, which is the only authority for these values.
|
|
10
10
|
|
|
11
|
-
Recipe kind `campaigns-os-node-v1`, revision `1.0.2`, validated by `schemas/campaigns-os-runtime-recipe.v1.schema.json` (`Campaigns OS Runtime Recipe v1`). Supported surface at generation time: `1.
|
|
11
|
+
Recipe kind `campaigns-os-node-v1`, revision `1.0.2`, validated by `schemas/campaigns-os-runtime-recipe.v1.schema.json` (`Campaigns OS Runtime Recipe v1`). Supported surface at generation time: `1.54.0`.
|
|
12
12
|
|
|
13
13
|
## What this is
|
|
14
14
|
|