@nextcommerce/campaigns-os 1.48.0 → 1.50.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 +113 -0
- package/agents/claude/CLAUDE.md +5 -4
- package/agents/codex/AGENTS.md +6 -5
- package/agents/copilot/copilot-instructions.md +3 -3
- package/agents/cursor/campaigns-os.mdc +3 -3
- package/compatibility.json +1 -1
- package/contracts/effects.v1.json +173 -0
- package/contracts/release-ledger.json +333 -0
- package/contracts/supported-surface.json +4 -4
- package/docs/brand-theme-bridge.md +12 -6
- package/docs/build-packet.md +8 -3
- package/docs/local-setup.md +1 -1
- package/docs/orientation-contract-reference.md +1 -1
- package/docs/qa-and-test-orders.md +21 -7
- package/docs/runtime-readiness.md +1 -1
- package/docs/skills-revision.md +10 -10
- package/package.json +1 -1
- package/schemas/campaign-runtime-build-packet.v0.schema.json +4 -0
- package/schemas/campaigns-os-qa-verdict.v0.schema.json +8 -3
- 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 +4 -4
- 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 +5 -4
- package/skills/next-campaigns-qa/SKILL.md +3 -3
- package/skills.json +10 -10
- package/src/brand-theme.mjs +13 -2
- package/src/cli.mjs +11 -9
- package/src/install-mode.mjs +0 -8
- package/src/invocation.mjs +3 -1
- package/src/qa-binding-evidence.mjs +21 -0
- package/src/qa-browser.mjs +30 -1
- package/src/qa-node.mjs +10 -2
- package/src/stage-record.mjs +303 -22
- package/src/theme-gate.mjs +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,119 @@
|
|
|
2
2
|
|
|
3
3
|
Notable supported-surface changes are recorded here.
|
|
4
4
|
|
|
5
|
+
## [1.50.0] - 2026-10-02
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- With `qa run --browser`, each page's `page-binding:<page_id>` row comes
|
|
10
|
+
from the key the Campaign Cart SDK actually sent. The SDK sends the page's
|
|
11
|
+
key as `Authorization` on every Campaigns API request. The browser pass
|
|
12
|
+
reads that header on each page it loads, compares it with the expected key
|
|
13
|
+
in memory and keeps only the outcome: `match` (pass) when every request
|
|
14
|
+
carried the expected key, `mismatch` (blocker) when any carried another.
|
|
15
|
+
The key itself is never recorded. The static read of a page's declarations
|
|
16
|
+
could not resolve most real pages: the starter templates' `config.js` opens
|
|
17
|
+
with `window.dataLayer = window.dataLayer || []` and
|
|
18
|
+
`window.nextReady = window.nextReady || []`, which the static grammar treats
|
|
19
|
+
as dynamic, so every starter page was left for manual review, and inline
|
|
20
|
+
scripts, `async` scripts and scripts from other origins left other pages
|
|
21
|
+
the same way. A page that sends no Campaigns API request, a run with no
|
|
22
|
+
single expected key, and `qa run` without `--browser` keep the static read.
|
|
23
|
+
- The QA verdict schema's page-binding evidence accepts
|
|
24
|
+
`observation: "sdk_request"` and the `sdk_request` source kind for that row.
|
|
25
|
+
Nothing is removed, so every verdict that validated before still does.
|
|
26
|
+
`docs/qa-and-test-orders.md` describes both observations.
|
|
27
|
+
- Ships the same-surface changes recorded since 1.49.0, each described in
|
|
28
|
+
its own section below: the agent context spells every command
|
|
29
|
+
`npx --no-install campaigns-os …` and carries the build skill's proof rule
|
|
30
|
+
(`+agent.1`); and the install-mode module drops a stale comment, with no
|
|
31
|
+
behavior change (`+agent.2`).
|
|
32
|
+
- Package and supported-surface version advance to 1.50.0 for the QA verdict
|
|
33
|
+
schema hash. The local setup install command pins 1.50.0. Bundled skills
|
|
34
|
+
carry revision `1.50.0+skills.1`, with each skill version advanced one
|
|
35
|
+
patch. The skill text is unchanged.
|
|
36
|
+
|
|
37
|
+
## [1.49.0+agent.2] - 2026-10-02
|
|
38
|
+
|
|
39
|
+
### Changed
|
|
40
|
+
|
|
41
|
+
- No command behaves differently. The install-mode module drops a trailing
|
|
42
|
+
comment that described `applyInvocationPrefix`, a function removed when
|
|
43
|
+
commands began to be spelled with their prefix at the source (`cmd()` and
|
|
44
|
+
`asInvocation` in the install-invocation module). Comment-only; every
|
|
45
|
+
message and every exit code is unchanged.
|
|
46
|
+
|
|
47
|
+
## [1.49.0+agent.1] - 2026-10-02
|
|
48
|
+
|
|
49
|
+
### Changed
|
|
50
|
+
|
|
51
|
+
- The agent context that `install-agent-context` and `tooling setup` write
|
|
52
|
+
(`agents/claude/CLAUDE.md`, `agents/codex/AGENTS.md`,
|
|
53
|
+
`agents/copilot/copilot-instructions.md`, `agents/cursor/campaigns-os.mdc`)
|
|
54
|
+
spells every command `npx --no-install campaigns-os …`, as the skills and
|
|
55
|
+
`AGENTS.md` do. It said `campaigns-os readback .`, `campaigns-os qa run …`
|
|
56
|
+
and so on, and fresh sessions ran them as written: "command not found"
|
|
57
|
+
where nothing is installed globally, and an older global copy instead of
|
|
58
|
+
the campaign's pinned one where something is. A test keeps bare commands
|
|
59
|
+
out of the agent context.
|
|
60
|
+
- The agent context carries the build skill's proof rule: reproduce the
|
|
61
|
+
source design's own proof and urgency elements as designed, and do not
|
|
62
|
+
remove, soften or flag them. The rule was only in the build and polish
|
|
63
|
+
skills, and sessions were still questioning or removing the merchant's
|
|
64
|
+
proof.
|
|
65
|
+
- An installed copy keeps the old text until `install-agent-context`
|
|
66
|
+
refreshes it.
|
|
67
|
+
|
|
68
|
+
## [1.49.0] - 2026-10-02
|
|
69
|
+
|
|
70
|
+
### Added
|
|
71
|
+
|
|
72
|
+
- `campaigns-os record theme --packet <p>` records an applied brand layer on
|
|
73
|
+
the Assembly Report, where the theme gate previously sent the operator to
|
|
74
|
+
edit `report.theme` by hand. It reads each built commerce page's stylesheet
|
|
75
|
+
links in document order. A page that loads `next-core.css` must load
|
|
76
|
+
`brand-theme.css` (or `checkout-brand.css`) after it, and that file must be
|
|
77
|
+
in the built output. A page that loads neither renders the design's own
|
|
78
|
+
markup and is left out, noted in the evidence. When every page passes and at
|
|
79
|
+
least one loads the brand layer, it writes `report.theme`: status `applied`,
|
|
80
|
+
`load_order` `after-next-core`, `css_path`, `commerce_pages` and one evidence
|
|
81
|
+
line per page, and clears any earlier theme waiver. Otherwise it is refused,
|
|
82
|
+
naming each page, and writes nothing. Build must be recorded for the current
|
|
83
|
+
output first. `--dry-run` runs every check and writes nothing.
|
|
84
|
+
- `campaigns-os record deploy --packet <p> --base-url <url>` records a local
|
|
85
|
+
preview (`deploy.target: local-serve`), where `next` previously sent the
|
|
86
|
+
operator to edit the packet and `stages.deploy` by hand. The URL must be a
|
|
87
|
+
loopback origin naming the campaign's route root. Every built page is
|
|
88
|
+
requested under it and must answer 2xx. It then writes the packet's
|
|
89
|
+
`deploy.preview_url` and `stages.deploy` completed, with the URL in
|
|
90
|
+
`outputs` and one evidence line per page. It is refused, writing nothing,
|
|
91
|
+
when any check fails, when polish is not recorded, when the built output
|
|
92
|
+
changed since build was recorded, or while the theme gate is blocked. The
|
|
93
|
+
requests stay on this machine. `--dry-run` runs every check, the requests
|
|
94
|
+
included, and writes nothing.
|
|
95
|
+
|
|
96
|
+
### Changed
|
|
97
|
+
|
|
98
|
+
- The theme gate's apply and load-order actions, the starter-palette notice,
|
|
99
|
+
the build prompt, the build and polish skills, `docs/brand-theme-bridge.md`
|
|
100
|
+
and `docs/build-packet.md` name `record theme` where they described a hand
|
|
101
|
+
edit of `report.theme`.
|
|
102
|
+
- `next`'s local-serve deploy action and deploy prompt,
|
|
103
|
+
`docs/build-packet.md` and `docs/qa-and-test-orders.md` name `record deploy`
|
|
104
|
+
where they described a hand edit of `deploy.preview_url` and
|
|
105
|
+
`stages.deploy`.
|
|
106
|
+
- `contracts/effects.v1.json` declares `record theme`, `record deploy` and
|
|
107
|
+
their `--dry-run` forms.
|
|
108
|
+
- The Build Packet schema's `assembly.template_family` accepts every family
|
|
109
|
+
the commerce surface catalog and the private template sources name:
|
|
110
|
+
`apollo`, `apollo-mv-single-step`, `arjuna` and `karna` join the enum, which
|
|
111
|
+
had fallen behind both. Nothing is removed, so every packet that validated
|
|
112
|
+
before still does.
|
|
113
|
+
- Package and supported-surface version advance to 1.49.0 for the effects
|
|
114
|
+
contract and Build Packet schema hashes. The local setup install command pins 1.49.0. Bundled skills
|
|
115
|
+
carry revision `1.49.0+skills.1`, with each skill version advanced one patch;
|
|
116
|
+
the build and polish skills also name `record theme`.
|
|
117
|
+
|
|
5
118
|
## [1.48.0] - 2026-10-02
|
|
6
119
|
|
|
7
120
|
### Changed
|
package/agents/claude/CLAUDE.md
CHANGED
|
@@ -6,7 +6,7 @@ Packet exists, read it and follow `next`. Check the loaded skill's bundle
|
|
|
6
6
|
revision and restart the session if it differs from the
|
|
7
7
|
project copy. Do not use private runtime source as the campaign's starting point.
|
|
8
8
|
|
|
9
|
-
To pick up an existing campaign, run `campaigns-os readback .` and `campaigns-os next --packet campaign-runtime.build.json` before reading artifacts by hand; `next` blocks polish and QA again whenever the built output changes. The committed `.campaign-runtime/qa-verdict.json` keeps no order records or URLs: its `browser-test-order:<path>` assertions are the typed-card proof, and the full verdict is under `qa-output/`.
|
|
9
|
+
To pick up an existing campaign, run `npx --no-install campaigns-os readback .` and `npx --no-install campaigns-os next --packet campaign-runtime.build.json` before reading artifacts by hand; `next` blocks polish and QA again whenever the built output changes. The committed `.campaign-runtime/qa-verdict.json` keeps no order records or URLs: its `browser-test-order:<path>` assertions are the typed-card proof, and the full verdict is under `qa-output/`.
|
|
10
10
|
|
|
11
11
|
Core rules:
|
|
12
12
|
|
|
@@ -19,15 +19,16 @@ Core rules:
|
|
|
19
19
|
- Prepared AI/exported HTML must be converted into page-kit-ready source first: keep page-owned body markup, strip document wrappers, add YAML frontmatter, move shared CSS/assets into the campaign structure, and use Liquid helpers only for page-kit links/assets/includes.
|
|
20
20
|
- Preserve prepared source HTML for landing/presell pages when it is a real standalone design.
|
|
21
21
|
- For checkout/upsell/downsell/receipt, use starter-template commerce surfaces as SDK contract references: preserve required `data-next-*` controls and runtime wiring, but let the campaign/source own visual chrome, copy hierarchy, imagery, and brand layer.
|
|
22
|
+
- Reproduce the source design's own proof and urgency elements as designed (reviews, ratings, stock counters, countdowns, guarantees). They are the merchant's content; Campaigns OS does not review them, so do not remove, soften or flag them.
|
|
22
23
|
- If `.campaign-runtime/build-context.json` has `theme` or `.campaign-runtime/theme/theme-report.json` exists, use it as optional brand-theme evidence. A generated `brand-theme.css` must load after `next-core.css`; missing or low-confidence theme is a warning/skipped reason, not permission to edit SDK-owned runtime surfaces.
|
|
23
24
|
- Copy a starter template family atomically with dependent pages, `_includes/`, `_layouts/`, `assets/css/`, and `assets/js/`; do not copy only checkout/receipt pages.
|
|
24
25
|
- Resolve SDK routing meta tags to campaign-root paths such as `/campaign-slug/upsell/`; do not emit source filenames or unrooted `upsell/` values into built checkout/upsell pages.
|
|
25
26
|
- Default one-time `packages.prepurchase_*` order bumps to fixed quantity rather than syncing with the main bundle unless the spec explicitly requires sync.
|
|
26
27
|
- Record spec-driven removals, such as unavailable payment methods, so polish does not reintroduce them.
|
|
27
28
|
- Do not copy Olympus-style `shipping_methods` frontmatter into `shop-three-step`; it uses dynamic shipping through `window.next.getShippingMethods()`.
|
|
28
|
-
- Run build/lint checks and record evidence in the assembly report, then hand off to polish. Before Polish becomes terminal or hands off to deploy/QA, install the package-owned Playwright browser with `npm run qa:install-browser`, serve the current build, and run `campaigns-os polish capture --packet campaign-runtime.build.json --base-url <served-current-build-url>`.
|
|
29
|
-
- After that checkpoint clears, QA uses the Campaigns OS Node/npm runner: run `campaigns-os qa resolve --packet campaign-runtime.build.json`, then run `campaigns-os qa run --packet campaign-runtime.build.json --base-url <url> --browser --test-order common`.
|
|
30
|
-
- Typed-card test-order proof uses `campaigns-os qa run --test-order <common|checkout|decline|accept|both|full|explicit-path>` through the deployed checkout and rendered upsell controls. `common` runs every actual terminal path when they fit under the flood cap (`--max-test-orders`, 6 by default); above the cap it runs the checkout baseline, first-offer accept and decline, and a deduplicated shortest real receipt path, then adds one decline path per offer or downsell page not yet declined, up to the cap, and names any page left out. A page counts as covered only when an order clicks its decline; the `browser-test-order:upsell-action-coverage` verdict row warns naming each page whose decline no order clicked. `full` walks every actual terminal path in the selected checkout topology; cycles, missing routes, and reachable nonterminals block exhaustive proof before browser launch. The accidental-flood cap remains `6`, and an overflow names the exact explicit `--max-test-orders` raise. Coverage is the only control — there is no permission/approval step.
|
|
29
|
+
- Run build/lint checks and record evidence in the assembly report, then hand off to polish. Before Polish becomes terminal or hands off to deploy/QA, install the package-owned Playwright browser with `npm run qa:install-browser`, serve the current build, and run `npx --no-install campaigns-os polish capture --packet campaign-runtime.build.json --base-url <served-current-build-url>`.
|
|
30
|
+
- After that checkpoint clears, QA uses the Campaigns OS Node/npm runner: run `npx --no-install campaigns-os qa resolve --packet campaign-runtime.build.json`, then run `npx --no-install campaigns-os qa run --packet campaign-runtime.build.json --base-url <url> --browser --test-order common`.
|
|
31
|
+
- Typed-card test-order proof uses `npx --no-install campaigns-os qa run --test-order <common|checkout|decline|accept|both|full|explicit-path>` through the deployed checkout and rendered upsell controls. `common` runs every actual terminal path when they fit under the flood cap (`--max-test-orders`, 6 by default); above the cap it runs the checkout baseline, first-offer accept and decline, and a deduplicated shortest real receipt path, then adds one decline path per offer or downsell page not yet declined, up to the cap, and names any page left out. A page counts as covered only when an order clicks its decline; the `browser-test-order:upsell-action-coverage` verdict row warns naming each page whose decline no order clicked. `full` walks every actual terminal path in the selected checkout topology; cycles, missing routes, and reachable nonterminals block exhaustive proof before browser launch. The accidental-flood cap remains `6`, and an overflow names the exact explicit `--max-test-orders` raise. Coverage is the only control — there is no permission/approval step.
|
|
31
32
|
- Analytics correctness is two-phase: the campaign-root visit inventories declared providers/tags only, and the same canonical typed-card run proves Purchase only from the topology-recognized final receipt document after `--analytics-settle`. Missing/unrecognized receipts are manual-review warnings; recognized receipt no-signal and capture/settle errors block. Only the genuine recognized-receipt/no-signal failure is waivable; capture/settle errors are not. Checkout/upsell signals remain whole-journey parity evidence and cannot satisfy a silent receipt.
|
|
32
33
|
- Test-order proof must use the canonical Playwright typed-card path through the tested checkout: select the rendered cart, fill customer/shipping fields, type the sandbox card into active hosted payment iframes, click the real submit button, then click rendered SDK upsell accept/decline controls and verify receipt/order evidence.
|
|
33
34
|
- Do not use `next.getCartData().cartLines` as cart-populated proof; use typed-card order read-back, `cart:updated` payload `items` / `summary.lines`, and rendered bundle DOM evidence.
|
package/agents/codex/AGENTS.md
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
Use this context when working in a target campaign repo with Campaigns OS artifacts.
|
|
4
4
|
|
|
5
5
|
- Read `campaign-runtime.build.json` first.
|
|
6
|
-
- To pick up an existing campaign, run `campaigns-os readback .` and `campaigns-os next --packet campaign-runtime.build.json` before reading artifacts by hand; `next` blocks polish and QA again whenever the built output changes. The committed `.campaign-runtime/qa-verdict.json` keeps no order records or URLs: its `browser-test-order:<path>` assertions are the typed-card proof, and the full verdict is under `qa-output/`.
|
|
6
|
+
- To pick up an existing campaign, run `npx --no-install campaigns-os readback .` and `npx --no-install campaigns-os next --packet campaign-runtime.build.json` before reading artifacts by hand; `next` blocks polish and QA again whenever the built output changes. The committed `.campaign-runtime/qa-verdict.json` keeps no order records or URLs: its `browser-test-order:<path>` assertions are the typed-card proof, and the full verdict is under `qa-output/`.
|
|
7
7
|
- If `.campaign-runtime/build-context.json` or `.campaign-runtime/assembly-report.json` exists, read them before editing campaign files.
|
|
8
|
-
- Run `campaigns-os doctor --packet campaign-runtime.build.json` before build work.
|
|
8
|
+
- Run `npx --no-install campaigns-os doctor --packet campaign-runtime.build.json` before build work.
|
|
9
9
|
- Treat CampaignSpec validation as owned by the public `@nextcommerce/campaigns-os/campaign-spec` rules surfaced through doctor `spec.validation` findings; use structured rule/path detail when available.
|
|
10
10
|
- Respect the selected template family's `agentContract`.
|
|
11
11
|
- Replace demo refs from CampaignSpec/API; do not preserve starter sample IDs.
|
|
@@ -13,15 +13,16 @@ Use this context when working in a target campaign repo with Campaigns OS artifa
|
|
|
13
13
|
- Prepared AI/exported HTML must be converted into page-kit-ready source first: keep page-owned body markup, strip document wrappers, add YAML frontmatter, move shared CSS/assets into the campaign structure, and use Liquid helpers only for page-kit links/assets/includes.
|
|
14
14
|
- Preserve prepared source HTML for landing/presell pages when it is a real standalone design.
|
|
15
15
|
- For checkout/upsell/downsell/receipt, use starter-template commerce surfaces as SDK contract references: preserve required `data-next-*` controls and runtime wiring, but let the campaign/source own visual chrome, copy hierarchy, imagery, and brand layer.
|
|
16
|
+
- Reproduce the source design's own proof and urgency elements as designed (reviews, ratings, stock counters, countdowns, guarantees). They are the merchant's content; Campaigns OS does not review them, so do not remove, soften or flag them.
|
|
16
17
|
- If `.campaign-runtime/build-context.json` has `theme` or `.campaign-runtime/theme/theme-report.json` exists, use it as optional brand-theme evidence. A generated `brand-theme.css` must load after `next-core.css`; missing or low-confidence theme is a warning/skipped reason, not permission to edit SDK-owned runtime surfaces.
|
|
17
18
|
- Copy a starter template family atomically with dependent pages, `_includes/`, `_layouts/`, `assets/css/`, and `assets/js/`; do not copy only checkout/receipt pages.
|
|
18
19
|
- Emit SDK routing meta tags as campaign-root paths such as `/campaign-slug/upsell/`.
|
|
19
20
|
- Default one-time `packages.prepurchase_*` bumps to fixed quantity unless the CampaignSpec explicitly requires package sync.
|
|
20
21
|
- Record spec-driven drops so polish does not reintroduce unsupported source elements.
|
|
21
22
|
- For `shop-three-step`, keep dynamic shipping via `window.next.getShippingMethods()` and do not add Olympus-style static `shipping_methods` frontmatter.
|
|
22
|
-
- Build hands off to polish. Before Polish becomes terminal or hands off to deploy/QA, install the package-owned Playwright browser with `npm run qa:install-browser`, serve the current build, and run `campaigns-os polish capture --packet campaign-runtime.build.json --base-url <served-current-build-url>`.
|
|
23
|
-
- After that checkpoint clears, QA uses the Campaigns OS Node/npm runner: run `campaigns-os qa resolve`, then `campaigns-os qa run --browser --test-order common` against the tested URL.
|
|
24
|
-
- Typed-card test-order proof uses `campaigns-os qa run --test-order <common|checkout|decline|accept|both|full|explicit-path>` through the tested checkout and rendered upsell controls. Global test cards bypass the gateway and create no transactions, so no permission/approval is needed — coverage is the only control. `common` runs every actual terminal path when they fit under the flood cap (`--max-test-orders`, 6 by default); above the cap it runs the checkout baseline, first-offer accept and decline, and a deduplicated shortest real receipt path, then adds one decline path per offer or downsell page not yet declined, up to the cap, and names any page left out. A page counts as covered only when an order clicks its decline; the `browser-test-order:upsell-action-coverage` verdict row warns naming each page whose decline no order clicked. `full` walks every actual terminal path in the selected checkout topology; cycles, missing routes, and reachable nonterminals block exhaustive proof before browser launch. The accidental-flood cap remains `6`, and an overflow names the exact explicit `--max-test-orders` raise. Localhost on any port is a Campaigns App Development domain for SDK QA with analytics suppressed; non-localhost preview/production origins still need SDK origin allowlist confirmation. Do not use external browser skills, the SDK test-mode event, or hand-built backend API orders as launch proof.
|
|
23
|
+
- Build hands off to polish. Before Polish becomes terminal or hands off to deploy/QA, install the package-owned Playwright browser with `npm run qa:install-browser`, serve the current build, and run `npx --no-install campaigns-os polish capture --packet campaign-runtime.build.json --base-url <served-current-build-url>`.
|
|
24
|
+
- After that checkpoint clears, QA uses the Campaigns OS Node/npm runner: run `npx --no-install campaigns-os qa resolve`, then `npx --no-install campaigns-os qa run --browser --test-order common` against the tested URL.
|
|
25
|
+
- Typed-card test-order proof uses `npx --no-install campaigns-os qa run --test-order <common|checkout|decline|accept|both|full|explicit-path>` through the tested checkout and rendered upsell controls. Global test cards bypass the gateway and create no transactions, so no permission/approval is needed — coverage is the only control. `common` runs every actual terminal path when they fit under the flood cap (`--max-test-orders`, 6 by default); above the cap it runs the checkout baseline, first-offer accept and decline, and a deduplicated shortest real receipt path, then adds one decline path per offer or downsell page not yet declined, up to the cap, and names any page left out. A page counts as covered only when an order clicks its decline; the `browser-test-order:upsell-action-coverage` verdict row warns naming each page whose decline no order clicked. `full` walks every actual terminal path in the selected checkout topology; cycles, missing routes, and reachable nonterminals block exhaustive proof before browser launch. The accidental-flood cap remains `6`, and an overflow names the exact explicit `--max-test-orders` raise. Localhost on any port is a Campaigns App Development domain for SDK QA with analytics suppressed; non-localhost preview/production origins still need SDK origin allowlist confirmation. Do not use external browser skills, the SDK test-mode event, or hand-built backend API orders as launch proof.
|
|
25
26
|
- Analytics correctness is two-phase: the campaign-root visit inventories declared providers/tags only, and the same canonical typed-card run proves Purchase only from the topology-recognized final receipt document after `--analytics-settle`. Missing/unrecognized receipts are manual-review warnings; recognized receipt no-signal and capture/settle errors block. Only the genuine recognized-receipt/no-signal failure is waivable; capture/settle errors are not. Checkout/upsell signals remain whole-journey parity evidence and cannot satisfy a silent receipt.
|
|
26
27
|
- Do not use `next.getCartData().cartLines` as cart-populated proof; use typed-card order read-back, `cart:updated` payload `items` / `summary.lines`, and rendered bundle DOM evidence.
|
|
27
28
|
- Campaigns OS proof is not merchant launch readiness. Before launch, confirm production storefront URL, live payment methods, shipping markets, legal/support URLs, analytics expectations, and merchant-side configuration.
|
|
@@ -5,11 +5,11 @@ When this repository contains Campaigns OS artifacts, use them as the build hand
|
|
|
5
5
|
- `campaign-runtime.build.json` defines the CampaignSpec, source adapter, target output, template family, deploy target, SDK origin state, and QA proof depth.
|
|
6
6
|
- `.campaign-runtime/build-context.json` records page mappings and setup/build handoff details.
|
|
7
7
|
- `.campaign-runtime/assembly-report.json` records stage evidence and blockers.
|
|
8
|
-
- To pick up an existing campaign, run `campaigns-os readback .` and `campaigns-os next --packet campaign-runtime.build.json` before reading artifacts by hand; `next` blocks polish and QA again whenever the built output changes. The committed `.campaign-runtime/qa-verdict.json` keeps no order records or URLs: its `browser-test-order:<path>` assertions are the typed-card proof, and the full verdict is under `qa-output/`.
|
|
8
|
+
- To pick up an existing campaign, run `npx --no-install campaigns-os readback .` and `npx --no-install campaigns-os next --packet campaign-runtime.build.json` before reading artifacts by hand; `next` blocks polish and QA again whenever the built output changes. The committed `.campaign-runtime/qa-verdict.json` keeps no order records or URLs: its `browser-test-order:<path>` assertions are the typed-card proof, and the full verdict is under `qa-output/`.
|
|
9
9
|
- `.campaign-runtime/theme/theme-report.json`, when present, is optional brand-theme evidence. Generated `brand-theme.css` must load after `next-core.css`; missing or low-confidence theme is a warning/skipped reason, not permission to edit SDK-owned runtime surfaces.
|
|
10
10
|
|
|
11
11
|
CampaignSpec validation is owned by the public `@nextcommerce/campaigns-os/campaign-spec` rules surfaced through doctor `spec.validation` findings; use structured rule/path detail when available.
|
|
12
12
|
|
|
13
|
-
Preserve Campaign Cart SDK-owned commerce surfaces. Replace starter demo refs from CampaignSpec/API. Prepared AI/exported HTML must be converted into page-kit-ready source first: keep page-owned body markup, strip document wrappers, add YAML frontmatter, move shared CSS/assets into the campaign structure, and use Liquid helpers only for page-kit links/assets/includes. Landing/presell pages can preserve source design; checkout/upsell/downsell/receipt should use starter-template commerce surfaces as SDK contract references while campaign/source owns visual chrome. Copy starter template families atomically with dependent pages, `_includes/`, `_layouts/`, `assets/css/`, and `assets/js/`; do not copy only checkout/receipt pages. Do not claim launch readiness until build, polish, deploy, and QA evidence are recorded.
|
|
13
|
+
Preserve Campaign Cart SDK-owned commerce surfaces. Replace starter demo refs from CampaignSpec/API. Prepared AI/exported HTML must be converted into page-kit-ready source first: keep page-owned body markup, strip document wrappers, add YAML frontmatter, move shared CSS/assets into the campaign structure, and use Liquid helpers only for page-kit links/assets/includes. Landing/presell pages can preserve source design; checkout/upsell/downsell/receipt should use starter-template commerce surfaces as SDK contract references while campaign/source owns visual chrome. Reproduce the source design's own proof and urgency elements as designed (reviews, ratings, stock counters, countdowns, guarantees). They are the merchant's content; Campaigns OS does not review them, so do not remove, soften or flag them. Copy starter template families atomically with dependent pages, `_includes/`, `_layouts/`, `assets/css/`, and `assets/js/`; do not copy only checkout/receipt pages. Do not claim launch readiness until build, polish, deploy, and QA evidence are recorded.
|
|
14
14
|
|
|
15
|
-
Before Polish becomes terminal or hands off to deploy/QA, install the package-owned Playwright browser with `npm run qa:install-browser`, serve the current build, and run `campaigns-os polish capture --packet campaign-runtime.build.json --base-url <served-current-build-url>`. After that checkpoint clears, QA must use the Campaigns OS Node/npm runner: run `campaigns-os qa resolve`, then run `campaigns-os qa run --browser --test-order common` against the tested URL. Typed-card test-order proof must use `campaigns-os qa run --test-order <common|checkout|decline|accept|both|full|explicit-path>` through the tested checkout and rendered upsell controls; global test cards bypass the gateway and create no transactions, so no permission/approval is needed. `common` runs every actual terminal path when they fit under the flood cap (`--max-test-orders`, 6 by default); above the cap it runs the checkout baseline, first-offer accept and decline, and a deduplicated shortest real receipt path, then adds one decline path per offer or downsell page not yet declined, up to the cap, and names any page left out. A page counts as covered only when an order clicks its decline; the `browser-test-order:upsell-action-coverage` verdict row warns naming each page whose decline no order clicked. `full` walks every actual terminal path in the selected checkout topology; cycles, missing routes, and reachable nonterminals block exhaustive proof before browser launch. The accidental-flood cap remains `6`, and an overflow names the exact explicit `--max-test-orders` raise. Analytics correctness is two-phase: the campaign-root visit inventories declared providers/tags only, and the same canonical typed-card run proves Purchase only from the topology-recognized final receipt document after `--analytics-settle`. Missing/unrecognized receipts are manual-review warnings; recognized receipt no-signal and capture/settle errors block. Only the genuine recognized-receipt/no-signal failure is waivable; capture/settle errors are not. Checkout/upsell signals remain whole-journey parity evidence and cannot satisfy a silent receipt. Do not use `next.getCartData().cartLines` as cart-populated proof; use typed-card order read-back, `cart:updated` payload `items` / `summary.lines`, and rendered bundle DOM evidence. Localhost on any port is a Campaigns App Development domain for SDK QA with analytics suppressed; non-localhost preview/production origins still need SDK origin allowlist confirmation. Do not use external browser skills, SDK test-mode events, or direct backend orders as launch proof. Campaigns OS proof is not merchant launch readiness; before launch, confirm production storefront URL, live payment methods, shipping markets, legal/support URLs, analytics expectations, and merchant-side configuration.
|
|
15
|
+
Before Polish becomes terminal or hands off to deploy/QA, install the package-owned Playwright browser with `npm run qa:install-browser`, serve the current build, and run `npx --no-install campaigns-os polish capture --packet campaign-runtime.build.json --base-url <served-current-build-url>`. After that checkpoint clears, QA must use the Campaigns OS Node/npm runner: run `npx --no-install campaigns-os qa resolve`, then run `npx --no-install campaigns-os qa run --browser --test-order common` against the tested URL. Typed-card test-order proof must use `npx --no-install campaigns-os qa run --test-order <common|checkout|decline|accept|both|full|explicit-path>` through the tested checkout and rendered upsell controls; global test cards bypass the gateway and create no transactions, so no permission/approval is needed. `common` runs every actual terminal path when they fit under the flood cap (`--max-test-orders`, 6 by default); above the cap it runs the checkout baseline, first-offer accept and decline, and a deduplicated shortest real receipt path, then adds one decline path per offer or downsell page not yet declined, up to the cap, and names any page left out. A page counts as covered only when an order clicks its decline; the `browser-test-order:upsell-action-coverage` verdict row warns naming each page whose decline no order clicked. `full` walks every actual terminal path in the selected checkout topology; cycles, missing routes, and reachable nonterminals block exhaustive proof before browser launch. The accidental-flood cap remains `6`, and an overflow names the exact explicit `--max-test-orders` raise. Analytics correctness is two-phase: the campaign-root visit inventories declared providers/tags only, and the same canonical typed-card run proves Purchase only from the topology-recognized final receipt document after `--analytics-settle`. Missing/unrecognized receipts are manual-review warnings; recognized receipt no-signal and capture/settle errors block. Only the genuine recognized-receipt/no-signal failure is waivable; capture/settle errors are not. Checkout/upsell signals remain whole-journey parity evidence and cannot satisfy a silent receipt. Do not use `next.getCartData().cartLines` as cart-populated proof; use typed-card order read-back, `cart:updated` payload `items` / `summary.lines`, and rendered bundle DOM evidence. Localhost on any port is a Campaigns App Development domain for SDK QA with analytics suppressed; non-localhost preview/production origins still need SDK origin allowlist confirmation. Do not use external browser skills, SDK test-mode events, or direct backend orders as launch proof. Campaigns OS proof is not merchant launch readiness; before launch, confirm production storefront URL, live payment methods, shipping markets, legal/support URLs, analytics expectations, and merchant-side configuration.
|
|
@@ -6,8 +6,8 @@ globs:
|
|
|
6
6
|
alwaysApply: false
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
Read Campaigns OS artifacts before editing campaign pages. To pick up an existing campaign, run `campaigns-os readback .` and `campaigns-os next --packet campaign-runtime.build.json` before reading artifacts by hand; `next` blocks polish and QA again whenever the built output changes. The committed `.campaign-runtime/qa-verdict.json` keeps no order records or URLs: its `browser-test-order:<path>` assertions are the typed-card proof, and the full verdict is under `qa-output/`. Treat CampaignSpec/API values as live commerce truth, starter-template contracts as SDK surface truth, and designed HTML/assets as visual/content intent. Treat CampaignSpec validation as owned by the public `@nextcommerce/campaigns-os/campaign-spec` rules surfaced through doctor `spec.validation` findings; use structured rule/path detail when available. If `context.theme` or `.campaign-runtime/theme/theme-report.json` exists, use it as optional brand-theme evidence; generated `brand-theme.css` must load after `next-core.css`, and missing/low-confidence theme is a warning or skipped reason, not permission to edit SDK-owned runtime surfaces.
|
|
9
|
+
Read Campaigns OS artifacts before editing campaign pages. To pick up an existing campaign, run `npx --no-install campaigns-os readback .` and `npx --no-install campaigns-os next --packet campaign-runtime.build.json` before reading artifacts by hand; `next` blocks polish and QA again whenever the built output changes. The committed `.campaign-runtime/qa-verdict.json` keeps no order records or URLs: its `browser-test-order:<path>` assertions are the typed-card proof, and the full verdict is under `qa-output/`. Treat CampaignSpec/API values as live commerce truth, starter-template contracts as SDK surface truth, and designed HTML/assets as visual/content intent. Treat CampaignSpec validation as owned by the public `@nextcommerce/campaigns-os/campaign-spec` rules surfaced through doctor `spec.validation` findings; use structured rule/path detail when available. If `context.theme` or `.campaign-runtime/theme/theme-report.json` exists, use it as optional brand-theme evidence; generated `brand-theme.css` must load after `next-core.css`, and missing/low-confidence theme is a warning or skipped reason, not permission to edit SDK-owned runtime surfaces.
|
|
10
10
|
|
|
11
|
-
Do not carry over demo package, shipping, voucher, payment, tracking, footer, or SEO values. Prepared AI/exported HTML must be converted into page-kit-ready source first: keep page-owned body markup, strip document wrappers, add YAML frontmatter, move shared CSS/assets into the campaign structure, and use Liquid helpers only for page-kit links/assets/includes. Preserve prepared landing/presell source HTML when it is a real standalone design. For checkout/upsell/downsell/receipt, use starter-template commerce surfaces as SDK contract references while campaign/source owns visual chrome. Copy starter template families atomically with dependent pages, `_includes/`, `_layouts/`, `assets/css/`, and `assets/js/`; do not copy only checkout/receipt pages. Emit SDK routing meta tags as campaign-root paths such as `/campaign-slug/upsell/`. Preserve SDK-owned checkout/cart/upsell/receipt surfaces. For `shop-three-step`, shipping is dynamic via `window.next.getShippingMethods()`.
|
|
11
|
+
Do not carry over demo package, shipping, voucher, payment, tracking, footer, or SEO values. Prepared AI/exported HTML must be converted into page-kit-ready source first: keep page-owned body markup, strip document wrappers, add YAML frontmatter, move shared CSS/assets into the campaign structure, and use Liquid helpers only for page-kit links/assets/includes. Preserve prepared landing/presell source HTML when it is a real standalone design. For checkout/upsell/downsell/receipt, use starter-template commerce surfaces as SDK contract references while campaign/source owns visual chrome. Reproduce the source design's own proof and urgency elements as designed (reviews, ratings, stock counters, countdowns, guarantees). They are the merchant's content; Campaigns OS does not review them, so do not remove, soften or flag them. Copy starter template families atomically with dependent pages, `_includes/`, `_layouts/`, `assets/css/`, and `assets/js/`; do not copy only checkout/receipt pages. Emit SDK routing meta tags as campaign-root paths such as `/campaign-slug/upsell/`. Preserve SDK-owned checkout/cart/upsell/receipt surfaces. For `shop-three-step`, shipping is dynamic via `window.next.getShippingMethods()`.
|
|
12
12
|
|
|
13
|
-
Before Polish becomes terminal or hands off to deploy/QA, install the package-owned Playwright browser with `npm run qa:install-browser`, serve the current build, and run `campaigns-os polish capture --packet campaign-runtime.build.json --base-url <served-current-build-url>`. After that checkpoint clears, QA uses the Campaigns OS Node/npm runner: `campaigns-os qa resolve`, then `campaigns-os qa run --browser --test-order common` against the tested URL. Test-order proof uses `campaigns-os qa run --test-order <common|checkout|decline|accept|both|full|explicit-path>` through the tested checkout and rendered upsell controls; global test cards bypass the gateway and create no transactions, so no permission/approval is needed. `common` runs every actual terminal path when they fit under the flood cap (`--max-test-orders`, 6 by default); above the cap it runs the checkout baseline, first-offer accept and decline, and a deduplicated shortest real receipt path, then adds one decline path per offer or downsell page not yet declined, up to the cap, and names any page left out. A page counts as covered only when an order clicks its decline; the `browser-test-order:upsell-action-coverage` verdict row warns naming each page whose decline no order clicked. `full` walks every actual terminal path in the selected checkout topology; cycles, missing routes, and reachable nonterminals block exhaustive proof before browser launch. The accidental-flood cap remains `6`, and an overflow names the exact explicit `--max-test-orders` raise. Analytics correctness is two-phase: the campaign-root visit inventories declared providers/tags only, and the same canonical typed-card run proves Purchase only from the topology-recognized final receipt document after `--analytics-settle`. Missing/unrecognized receipts are manual-review warnings; recognized receipt no-signal and capture/settle errors block. Only the genuine recognized-receipt/no-signal failure is waivable; capture/settle errors are not. Checkout/upsell signals remain whole-journey parity evidence and cannot satisfy a silent receipt. Do not use `next.getCartData().cartLines` as cart-populated proof; use typed-card order read-back, `cart:updated` payload `items` / `summary.lines`, and rendered bundle DOM evidence. Localhost on any port is a Campaigns App Development domain for SDK QA with analytics suppressed; non-localhost preview/production origins still need SDK origin allowlist confirmation. External browser skills, SDK test-mode events, and direct backend orders are not launch proof. Campaigns OS proof is not merchant launch readiness; before launch, confirm production storefront URL, live payment methods, shipping markets, legal/support URLs, analytics expectations, and merchant-side configuration.
|
|
13
|
+
Before Polish becomes terminal or hands off to deploy/QA, install the package-owned Playwright browser with `npm run qa:install-browser`, serve the current build, and run `npx --no-install campaigns-os polish capture --packet campaign-runtime.build.json --base-url <served-current-build-url>`. After that checkpoint clears, QA uses the Campaigns OS Node/npm runner: `npx --no-install campaigns-os qa resolve`, then `npx --no-install campaigns-os qa run --browser --test-order common` against the tested URL. Test-order proof uses `npx --no-install campaigns-os qa run --test-order <common|checkout|decline|accept|both|full|explicit-path>` through the tested checkout and rendered upsell controls; global test cards bypass the gateway and create no transactions, so no permission/approval is needed. `common` runs every actual terminal path when they fit under the flood cap (`--max-test-orders`, 6 by default); above the cap it runs the checkout baseline, first-offer accept and decline, and a deduplicated shortest real receipt path, then adds one decline path per offer or downsell page not yet declined, up to the cap, and names any page left out. A page counts as covered only when an order clicks its decline; the `browser-test-order:upsell-action-coverage` verdict row warns naming each page whose decline no order clicked. `full` walks every actual terminal path in the selected checkout topology; cycles, missing routes, and reachable nonterminals block exhaustive proof before browser launch. The accidental-flood cap remains `6`, and an overflow names the exact explicit `--max-test-orders` raise. Analytics correctness is two-phase: the campaign-root visit inventories declared providers/tags only, and the same canonical typed-card run proves Purchase only from the topology-recognized final receipt document after `--analytics-settle`. Missing/unrecognized receipts are manual-review warnings; recognized receipt no-signal and capture/settle errors block. Only the genuine recognized-receipt/no-signal failure is waivable; capture/settle errors are not. Checkout/upsell signals remain whole-journey parity evidence and cannot satisfy a silent receipt. Do not use `next.getCartData().cartLines` as cart-populated proof; use typed-card order read-back, `cart:updated` payload `items` / `summary.lines`, and rendered bundle DOM evidence. Localhost on any port is a Campaigns App Development domain for SDK QA with analytics suppressed; non-localhost preview/production origins still need SDK origin allowlist confirmation. External browser skills, SDK test-mode events, and direct backend orders are not launch proof. Campaigns OS proof is not merchant launch readiness; before launch, confirm production storefront URL, live payment methods, shipping markets, legal/support URLs, analytics expectations, and merchant-side configuration.
|
package/compatibility.json
CHANGED
|
@@ -5816,6 +5816,179 @@
|
|
|
5816
5816
|
"test_scope": "full",
|
|
5817
5817
|
"notes": "record polish --dry-run runs every check the real invocation runs and prints what it would write; it writes nothing under the target, appends no lifecycle entry (the command is declared `dryRun` in src/invocation.mjs) and runs no stale-session closeout."
|
|
5818
5818
|
},
|
|
5819
|
+
{
|
|
5820
|
+
"command": "record",
|
|
5821
|
+
"subcommand": "theme",
|
|
5822
|
+
"flags": [],
|
|
5823
|
+
"annotations": {
|
|
5824
|
+
"readOnlyHint": false,
|
|
5825
|
+
"destructiveHint": true,
|
|
5826
|
+
"openWorldHint": false,
|
|
5827
|
+
"idempotentHint": false
|
|
5828
|
+
},
|
|
5829
|
+
"tier": "C",
|
|
5830
|
+
"writes": [
|
|
5831
|
+
{
|
|
5832
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
5833
|
+
"when": "the record passes every check — theme.status becomes applied with load_order after-next-core, css_path, commerce_pages and per-page evidence read from the built pages; any earlier theme waiver is cleared",
|
|
5834
|
+
"observed_in": [
|
|
5835
|
+
"no_session",
|
|
5836
|
+
"ambient_session",
|
|
5837
|
+
"stale_session",
|
|
5838
|
+
"lifecycle_log",
|
|
5839
|
+
"persisted_consent"
|
|
5840
|
+
]
|
|
5841
|
+
},
|
|
5842
|
+
{
|
|
5843
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
5844
|
+
"when": "a retained doctor sidecar exists — the record postdates the doctor snapshot, so it is stamped stale",
|
|
5845
|
+
"observed_in": [
|
|
5846
|
+
"no_session",
|
|
5847
|
+
"ambient_session",
|
|
5848
|
+
"stale_session",
|
|
5849
|
+
"lifecycle_log",
|
|
5850
|
+
"persisted_consent"
|
|
5851
|
+
]
|
|
5852
|
+
},
|
|
5853
|
+
{
|
|
5854
|
+
"path": "{lifecycle-journal}",
|
|
5855
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
5856
|
+
"observed_in": [
|
|
5857
|
+
"ambient_session",
|
|
5858
|
+
"lifecycle_log"
|
|
5859
|
+
]
|
|
5860
|
+
}
|
|
5861
|
+
],
|
|
5862
|
+
"sends": [],
|
|
5863
|
+
"effect_test": "effects: record theme",
|
|
5864
|
+
"test_scope": "full",
|
|
5865
|
+
"notes": "Destructive: it replaces report.theme's status, css_path, load_order, commerce_pages, evidence and waiver. Refused, writing nothing, when build is not recorded for the current output, when the campaign ships no commerce pages, when a built commerce page that loads next-core.css does not load brand-theme.css (or checkout-brand.css) after it, or links one that is not in the built output, or when no built commerce page loads next-core.css. The Build Context is read, not written."
|
|
5866
|
+
},
|
|
5867
|
+
{
|
|
5868
|
+
"command": "record",
|
|
5869
|
+
"subcommand": "theme",
|
|
5870
|
+
"flags": [
|
|
5871
|
+
"--dry-run"
|
|
5872
|
+
],
|
|
5873
|
+
"annotations": {
|
|
5874
|
+
"readOnlyHint": true,
|
|
5875
|
+
"destructiveHint": false,
|
|
5876
|
+
"openWorldHint": false,
|
|
5877
|
+
"idempotentHint": true
|
|
5878
|
+
},
|
|
5879
|
+
"tier": "none",
|
|
5880
|
+
"writes": [],
|
|
5881
|
+
"sends": [],
|
|
5882
|
+
"effect_test": "effects: record theme --dry-run",
|
|
5883
|
+
"test_scope": "full",
|
|
5884
|
+
"notes": "record theme --dry-run runs every check the real invocation runs and prints what it would write; it writes nothing under the target, appends no lifecycle entry (the command is declared `dryRun` in src/invocation.mjs) and runs no stale-session closeout."
|
|
5885
|
+
},
|
|
5886
|
+
{
|
|
5887
|
+
"command": "record",
|
|
5888
|
+
"subcommand": "deploy",
|
|
5889
|
+
"flags": [],
|
|
5890
|
+
"annotations": {
|
|
5891
|
+
"readOnlyHint": false,
|
|
5892
|
+
"destructiveHint": true,
|
|
5893
|
+
"openWorldHint": true,
|
|
5894
|
+
"idempotentHint": false
|
|
5895
|
+
},
|
|
5896
|
+
"tier": "C",
|
|
5897
|
+
"writes": [
|
|
5898
|
+
{
|
|
5899
|
+
"path": "{packet}",
|
|
5900
|
+
"when": "the record passes every check — deploy.preview_url becomes the served URL",
|
|
5901
|
+
"observed_in": [
|
|
5902
|
+
"no_session",
|
|
5903
|
+
"ambient_session",
|
|
5904
|
+
"stale_session",
|
|
5905
|
+
"lifecycle_log",
|
|
5906
|
+
"persisted_consent"
|
|
5907
|
+
]
|
|
5908
|
+
},
|
|
5909
|
+
{
|
|
5910
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
5911
|
+
"when": "the record passes every check — stages.deploy becomes completed with the served URL in outputs and one evidence line per page that answered",
|
|
5912
|
+
"observed_in": [
|
|
5913
|
+
"no_session",
|
|
5914
|
+
"ambient_session",
|
|
5915
|
+
"stale_session",
|
|
5916
|
+
"lifecycle_log",
|
|
5917
|
+
"persisted_consent"
|
|
5918
|
+
]
|
|
5919
|
+
},
|
|
5920
|
+
{
|
|
5921
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
5922
|
+
"when": "a retained doctor sidecar exists — the record postdates the doctor snapshot, so it is stamped stale",
|
|
5923
|
+
"observed_in": [
|
|
5924
|
+
"no_session",
|
|
5925
|
+
"ambient_session",
|
|
5926
|
+
"stale_session",
|
|
5927
|
+
"lifecycle_log",
|
|
5928
|
+
"persisted_consent"
|
|
5929
|
+
]
|
|
5930
|
+
},
|
|
5931
|
+
{
|
|
5932
|
+
"path": "{lifecycle-journal}",
|
|
5933
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
5934
|
+
"observed_in": [
|
|
5935
|
+
"ambient_session",
|
|
5936
|
+
"lifecycle_log"
|
|
5937
|
+
]
|
|
5938
|
+
}
|
|
5939
|
+
],
|
|
5940
|
+
"sends": [
|
|
5941
|
+
{
|
|
5942
|
+
"destination": "{base-url}",
|
|
5943
|
+
"what": "a GET for each built page under the served URL, to prove the local preview answers before it is recorded",
|
|
5944
|
+
"when": "the packet's deploy target is local-serve and --base-url is a loopback origin naming the campaign's route root",
|
|
5945
|
+
"requires_consent": false,
|
|
5946
|
+
"observed_in": [
|
|
5947
|
+
"no_session",
|
|
5948
|
+
"ambient_session",
|
|
5949
|
+
"stale_session",
|
|
5950
|
+
"lifecycle_log",
|
|
5951
|
+
"persisted_consent"
|
|
5952
|
+
]
|
|
5953
|
+
}
|
|
5954
|
+
],
|
|
5955
|
+
"effect_test": "effects: record deploy",
|
|
5956
|
+
"test_scope": "full",
|
|
5957
|
+
"notes": "Destructive: it replaces stages.deploy and the packet's deploy.preview_url. The requests stay on this machine: --base-url must be a loopback origin. Refused, writing nothing, when the packet is not local-serve, the URL is not loopback or not 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. The Build Context is read, not written."
|
|
5958
|
+
},
|
|
5959
|
+
{
|
|
5960
|
+
"command": "record",
|
|
5961
|
+
"subcommand": "deploy",
|
|
5962
|
+
"flags": [
|
|
5963
|
+
"--dry-run"
|
|
5964
|
+
],
|
|
5965
|
+
"annotations": {
|
|
5966
|
+
"readOnlyHint": false,
|
|
5967
|
+
"destructiveHint": false,
|
|
5968
|
+
"openWorldHint": true,
|
|
5969
|
+
"idempotentHint": true
|
|
5970
|
+
},
|
|
5971
|
+
"tier": "A",
|
|
5972
|
+
"writes": [],
|
|
5973
|
+
"sends": [
|
|
5974
|
+
{
|
|
5975
|
+
"destination": "{base-url}",
|
|
5976
|
+
"what": "a GET for each built page under the served URL, to prove the local preview answers before it is recorded",
|
|
5977
|
+
"when": "the packet's deploy target is local-serve and --base-url is a loopback origin naming the campaign's route root",
|
|
5978
|
+
"requires_consent": false,
|
|
5979
|
+
"observed_in": [
|
|
5980
|
+
"no_session",
|
|
5981
|
+
"ambient_session",
|
|
5982
|
+
"stale_session",
|
|
5983
|
+
"lifecycle_log",
|
|
5984
|
+
"persisted_consent"
|
|
5985
|
+
]
|
|
5986
|
+
}
|
|
5987
|
+
],
|
|
5988
|
+
"effect_test": "effects: record deploy --dry-run",
|
|
5989
|
+
"test_scope": "full",
|
|
5990
|
+
"notes": "record deploy --dry-run runs every check the real invocation runs, the page requests included, and prints what it would write; it writes nothing under the target, appends no lifecycle entry (the command is declared `dryRun` in src/invocation.mjs) and runs no stale-session closeout."
|
|
5991
|
+
},
|
|
5819
5992
|
{
|
|
5820
5993
|
"command": "login",
|
|
5821
5994
|
"subcommand": null,
|