@nextcommerce/campaigns-os 1.50.0 → 1.53.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 +474 -0
- package/agents/claude/CLAUDE.md +4 -2
- package/agents/codex/AGENTS.md +3 -1
- package/agents/copilot/copilot-instructions.md +3 -1
- package/agents/cursor/campaigns-os.mdc +3 -1
- package/campaign-spec/dist/rules/campaign-metadata.d.ts +5 -1
- package/campaign-spec/dist/rules/campaign-metadata.js +9 -2
- package/campaign-spec/dist/rules/design-source-shape.js +13 -3
- package/campaign-spec/dist/rules/sdk-version.js +2 -1
- package/compatibility.json +1 -1
- package/contracts/commerce-surface-catalog.json +26 -46
- package/contracts/effects.v1.json +282 -14
- package/contracts/release-ledger.json +1233 -0
- package/contracts/supported-surface.json +2 -2
- package/contracts/template-brand-contract.shared-commerce.v0.json +2 -2
- package/contracts/template-slot-manifest.shared-content-core.v0.json +24 -0
- package/docs/brand-theme-bridge.md +2 -0
- package/docs/build-packet.md +148 -23
- package/docs/campaign-build-brief.md +57 -2
- package/docs/effects.md +14 -0
- package/docs/local-setup.md +1 -1
- package/docs/orientation-contract-reference.md +1 -1
- package/docs/polish-evidence.md +12 -0
- package/docs/progress-snapshots.md +2 -4
- package/docs/qa-and-test-orders.md +47 -4
- package/docs/readback.md +19 -2
- package/docs/runtime-readiness.md +1 -1
- package/docs/sdk-storage-compatibility.md +1 -1
- package/docs/skills-revision.md +10 -10
- package/package.json +1 -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 +5 -3
- package/skills/next-campaigns-os/SKILL.md +11 -20
- package/skills/next-campaigns-os/references/session-intake.md +17 -9
- package/skills/next-campaigns-os-setup/SKILL.md +4 -3
- package/skills/next-campaigns-polish/SKILL.md +7 -5
- package/skills/next-campaigns-qa/SKILL.md +8 -5
- package/skills.json +10 -10
- package/src/adapter-decision-contract.mjs +1 -1
- package/src/brand-theme.mjs +33 -20
- package/src/brief-summary.mjs +275 -0
- package/src/build-brief.mjs +229 -30
- package/src/built-site-scope.mjs +39 -6
- package/src/built-smoke-qc.mjs +1117 -0
- package/src/campaign-identity.mjs +36 -2
- package/src/cart-placeholders.mjs +730 -0
- package/src/cli.mjs +467 -143
- package/src/commercial-journey.mjs +65 -4
- package/src/commercial-parity.mjs +6 -1
- package/src/contrast.mjs +649 -0
- package/src/design-source-publication.mjs +110 -3
- package/src/doctor/checks.mjs +415 -33
- package/src/doctor/inspect.mjs +53 -2
- package/src/doctor/next-step.mjs +16 -7
- package/src/input-currency.mjs +394 -0
- package/src/input-refresh.mjs +708 -0
- package/src/invocation.mjs +5 -2
- package/src/local-preview-policy.mjs +1 -1
- package/src/local-proof.mjs +4 -1
- package/src/polish-browser.mjs +660 -141
- package/src/polish-capture.mjs +1 -1
- package/src/polish-deadline.mjs +7 -0
- package/src/polish-media-weight.mjs +492 -0
- package/src/polish-node.mjs +400 -28
- package/src/polish-readability.mjs +828 -0
- package/src/progress-node.mjs +19 -3
- package/src/qa-browser.mjs +439 -180
- package/src/qa-content-params.mjs +889 -0
- package/src/qa-node.mjs +116 -13
- package/src/qa-order-bump.mjs +22 -1
- package/src/qa-policy-links.mjs +1019 -0
- package/src/qa-tracking-params.mjs +1389 -0
- package/src/qa-url-privacy.mjs +168 -0
- package/src/qc-accept.mjs +482 -0
- package/src/qc-check-registry.mjs +91 -0
- package/src/qc-results.mjs +1341 -0
- package/src/readback.mjs +58 -10
- package/src/sdk-attribute-index.mjs +71 -0
- package/src/sdk-markup.mjs +2 -2
- package/src/sdk-storage-compatibility.mjs +63 -3
- package/src/source-prep.mjs +37 -7
- package/src/stage-ledger.mjs +235 -44
- package/src/stage-record.mjs +165 -33
- package/src/tooling-setup.mjs +1 -1
|
@@ -39,8 +39,10 @@ the toolkit runs that loop in a fixed order:
|
|
|
39
39
|
1. **Build in development.** The build stage runs page-kit in the development
|
|
40
40
|
environment — `CPK_ENV=development npx campaign-build --json >
|
|
41
41
|
.campaign-runtime/page-kit-build-summary.json` — into the target's normal
|
|
42
|
-
`_site/`, and
|
|
43
|
-
|
|
42
|
+
`_site/`, and `campaigns-os record build --packet <packet>
|
|
43
|
+
--build-environment development` records
|
|
44
|
+
`stages.assembly.evidence.build_environment: "development"` on the Assembly
|
|
45
|
+
Report. `next build` names the command as
|
|
44
46
|
the `build_local_proof` action and in the build prompt; doctor warns
|
|
45
47
|
(`local_proof.build_environment`) on a completed build that is not recorded
|
|
46
48
|
as a development render. The starter templates gate every vendor loader on
|
|
@@ -368,7 +370,11 @@ Only contract-governed claims are compared, and only against `Exact` normalized
|
|
|
368
370
|
truth. Proven differences emit warn-severity `pricing` assertions named
|
|
369
371
|
`price-claim-mismatch`, `cadence-disclosure-mismatch`, or
|
|
370
372
|
`voucher-not-applied`. Decorative, ambiguous, stale, unresolved, or malformed
|
|
371
|
-
claims remain silent.
|
|
373
|
+
claims remain silent. A page showing a voucher the normalized plan cannot price
|
|
374
|
+
(no calculated pair for its code, for example a live voucher on an upsell)
|
|
375
|
+
leaves that page's price claims unresolved: the plan's only Exact truth for
|
|
376
|
+
the page is then the list price, which a voucher-priced page is expected to
|
|
377
|
+
differ from. The verdict's top-level `commercial` section records
|
|
372
378
|
coverage, sanitized missing/unmatched/invalid capture evidence, proxy issues,
|
|
373
379
|
and findings; the same findings are serialized deterministically into the flat
|
|
374
380
|
`assertions` array consumed by existing QA tooling. A proven mismatch keeps the
|
|
@@ -1600,7 +1606,7 @@ the CampaignSpec instead:
|
|
|
1600
1606
|
purchase multipliers (`ref` and `ref:2`). A uniquely referenced catalog
|
|
1601
1607
|
package with its own `qty: 3` composition is still bought once (`ref`), not
|
|
1602
1608
|
multiplied by three. **Order-bump rows — `packages[]` entries marked
|
|
1603
|
-
`is_upsell: true` — are add-ons offered beside the selected tier, not tiers**:
|
|
1609
|
+
`is_order_bump: true` or `is_upsell: true` — are add-ons offered beside the selected tier, not tiers**:
|
|
1604
1610
|
they never become a plan (a three-tier checkout with one bump plans three
|
|
1605
1611
|
tiers, so `tiers:common` on a two-upsell funnel is 12 orders, not 16), and
|
|
1606
1612
|
the runner prints a `[qa:test-order]` line naming the bump ref(s) it left
|
|
@@ -1859,6 +1865,36 @@ table in [build-packet.md](./build-packet.md#deploy-target) and
|
|
|
1859
1865
|
[Local proof mode](#local-proof-mode-deploytarget-local-serve) above for the
|
|
1860
1866
|
development build, the parity check, and the order they run in.
|
|
1861
1867
|
|
|
1868
|
+
### Tracking parameters
|
|
1869
|
+
|
|
1870
|
+
**Tracking parameters.** During a browser test order, QA adds synthetic tracking values (`utm_*`, `affid`, `sub1`, `subaffiliate2`, and up to eight names from `analytics.params.tracking.preserve`) to the pages it loads before the campaign's own navigation starts. It reports two results:
|
|
1871
|
+
|
|
1872
|
+
- **URL preservation:** whether each value is still in the address after each page navigation it observed, through to the navigation after the order. A failing step is named only when QA observed both sides of it. A reload by QA itself, an unobserved step, or an attempt that ended early ends the measurement without a pass.
|
|
1873
|
+
- **Order attribution:** whether the matching attribution field reached the request of an order the store accepted.
|
|
1874
|
+
|
|
1875
|
+
Values from `<meta name="os-tracking-tag">` tags are checked against order metadata. When page script sets attribution itself, differences are review results. Only synthetic values and equality results are stored, and order URLs in QA evidence are now stored without their query. Click ids and `funnel` are not seeded, even when listed in `tracking.preserve`, and are listed as not tested.
|
|
1876
|
+
|
|
1877
|
+
Every string QA stores in its verdict is cut at its first query (a `?`, written literally or percent-encoded), every URL in it is also cut at its fragment, and a string longer than 16 KiB is truncated.
|
|
1878
|
+
|
|
1879
|
+
## Content parameters
|
|
1880
|
+
|
|
1881
|
+
**Content parameters.** For each `analytics.params.content` entry, QA loads each applicable page twice in separate fresh browser contexts: once without the parameter and once with `?<name>=n`. It waits for the SDK to finish its display pass, then checks that the same elements whose `data-next-hide` or `data-next-show` refers to `param.<name>` are visible without the parameter and hidden with it. A parameter whose only handlers cannot hide anything with `n` is a warning. Compound conditions, conditions the SDK parses unreliably, content already hidden without the parameter, elements that change between the two loads, pages that fail to load, and pages where the SDK did not finish produce review or unexercised results, never a pass. Runs without `--browser` list these checks as not requested. No orders are placed.
|
|
1882
|
+
|
|
1883
|
+
## Policy links
|
|
1884
|
+
|
|
1885
|
+
**Policy links.** For each configured `store_terms`, `store_privacy`, `store_returns`, `store_shipping`, and `store_contact` URL, QA checks two things:
|
|
1886
|
+
|
|
1887
|
+
- **Presence:** whether any visited page links to that exact destination, with trailing slashes and default ports normalized and query parameters kept. Presence is decided only when QA read the links on every page it visits; otherwise it is unexercised.
|
|
1888
|
+
- **Availability:** whether the URL reaches an HTML page within 5 redirects, using bounded GET requests that read headers only.
|
|
1889
|
+
|
|
1890
|
+
A redirect to the right page is fine. Missing links, links whose query differs, links whose declared footer label points elsewhere, 404s, server errors and redirects to the store's home page are warnings. Authentication, rate limiting, loops, non-HTML responses, unexpected statuses, configured values that are not absolute URLs, and redirects to other destinations are review results. Network failures are unexercised. A 200 response proves only that the page is reachable. `mailto:` contacts are checked for presence only. Runs without `--browser` list these checks as not requested. Link wording is used only as an English review hint.
|
|
1891
|
+
|
|
1892
|
+
## Operator accepts (`checkpoint accept`)
|
|
1893
|
+
|
|
1894
|
+
**Accepting a warning.** `campaigns-os checkpoint accept` records an operator's decision about a warning that a Campaigns OS check measured. It does not change readiness, does not remove the warning, does not change the status `next` reports, and cannot be used on review, unexercised, or excluded results. The warning must already be on record (in the doctor snapshot `next` writes, the Polish capture, or the full QA verdict) before it can be accepted. The accept is bound to the exact measured state and lapses when that state changes, or when its evidence is stale or cannot be reproduced. An optional expiry or review condition adds a second bound. Run it only with the operator's explicit decision, made after the warning was shown to them. A plausible name is not authorization. The command refuses placeholder and automation identities. Results are re-derived from the package's raw captures on every read, and a result whose capture is missing or does not match is listed as unexercised. These checks are tamper evidence, not proof of authorship: a hand-written record that copies every value and recomputes the checksum, or a hand-written result written together with a matching capture, is not detected.
|
|
1895
|
+
|
|
1896
|
+
A readability warning is keyed by its colour pair and text size class on each page and width. The QC handoff lists each pair once with every page and width that uses it. Accepting it, with one `checkpoint accept` naming every listed ref, records the operator's decision for those pages. The accept states whether it covers normal text, large text, or both, by which size-class refs are named. When either colour changes, the pair becomes a new warning, and the old accept no longer matches any result (it is listed as orphaned). An accept lapses when the exact colours, ratio, font size or font weight of any text using the pair on that page change, when its capture is stale — including built output that changed since the build was recorded — or when it cannot be reproduced, including a missing crop. A page that starts using the same pair later is a new warning. An accept never hides review, unexercised or excluded results.
|
|
1897
|
+
|
|
1862
1898
|
## Launch Readiness Note
|
|
1863
1899
|
|
|
1864
1900
|
Campaigns OS can prove the campaign build, SDK wiring, browser behavior, and
|
|
@@ -1886,6 +1922,13 @@ use the declared topology instead of a single happy path:
|
|
|
1886
1922
|
5. Use `full` when you want every actual terminal path, raising the flood cap to
|
|
1887
1923
|
the exact planned count when necessary.
|
|
1888
1924
|
|
|
1925
|
+
`next` names step 4 at the QA stage. When the checkout page the default run
|
|
1926
|
+
drives declares an order bump (`is_order_bump: true` or `is_upsell: true` rows), it lists a second QA
|
|
1927
|
+
command, `qa_run_bump`, beside `qa_run`: the same `--test-order common` run
|
|
1928
|
+
with `--cart <base>:1,<bump>:1`, where the base is the first selector tier the
|
|
1929
|
+
checkout declares. The QA stage prompt and the human `next` output carry the
|
|
1930
|
+
same command.
|
|
1931
|
+
|
|
1889
1932
|
Record order numbers, `ref_id` values, and expected line-item shapes in the
|
|
1890
1933
|
handoff. If the browser console shows an SDK module-load error but the SDK
|
|
1891
1934
|
fallback loads and checkout/order proof passes, keep it as platform warning
|
package/docs/readback.md
CHANGED
|
@@ -6,7 +6,9 @@ Packet, the doctor output sidecar, the build context, the assembly report, a QA
|
|
|
6
6
|
verdict, and a findings export when present. It reads each of those files at
|
|
7
7
|
most once, plus two fixed Git metadata files (the nearest `.git` entry at the
|
|
8
8
|
target or an ancestor, and that Git directory's `logs/HEAD` reflog) for the
|
|
9
|
-
freshness comparison
|
|
9
|
+
freshness comparison, and the CampaignSpec and normalized Campaign Build Brief
|
|
10
|
+
the Build Packet names, whose current content decides each stage's effective
|
|
11
|
+
status.
|
|
10
12
|
|
|
11
13
|
The safety contract is the point of the command. The readback **writes nothing**
|
|
12
14
|
under the target — not even a lifecycle journal entry, which every other command
|
|
@@ -107,7 +109,7 @@ RUN IDENTITY
|
|
|
107
109
|
template_family = olympus [build packet]
|
|
108
110
|
qa run_id = MSRBUNDLEFIXTURE000000000000 [QA verdict]
|
|
109
111
|
|
|
110
|
-
STAGES [assembly report; report status: prepared]
|
|
112
|
+
STAGES [assembly report; report status: prepared; effective: prepared]
|
|
111
113
|
prepare_build completed
|
|
112
114
|
doctor pending
|
|
113
115
|
setup pending
|
|
@@ -129,6 +131,21 @@ QA VERDICT [QA verdict; disposition: ready — Campaigns OS is the verdict auth
|
|
|
129
131
|
pass http:checkout (family funnel-flow)
|
|
130
132
|
```
|
|
131
133
|
|
|
134
|
+
### STAGES
|
|
135
|
+
|
|
136
|
+
The STAGES header prints the status the Assembly Report records and the status recomputed from each stage's effective status. A stage's effective status is the recorded one, except that a stage made owed again by a brief or CampaignSpec change reads `required`, and a stage whose inputs cannot be confirmed reads `unknown`. When the two differ, the stage line adds the recorded status and the reason. Superseded records appear only under "history (not current proof)".
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
STAGES [assembly report; report status: completed; effective: prepared]
|
|
140
|
+
prepare_build completed
|
|
141
|
+
doctor pending
|
|
142
|
+
setup completed
|
|
143
|
+
assembly required (recorded: completed; spec_material_changed)
|
|
144
|
+
polish required (recorded: completed; spec_material_changed)
|
|
145
|
+
deploy completed
|
|
146
|
+
qa required (recorded: completed; spec_material_changed)
|
|
147
|
+
```
|
|
148
|
+
|
|
132
149
|
## The JSON contract
|
|
133
150
|
|
|
134
151
|
```json
|
|
@@ -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.53.0`.
|
|
12
12
|
|
|
13
13
|
## What this is
|
|
14
14
|
|
|
@@ -10,7 +10,7 @@ Omit `--json` for the concise human report. Exit 0 means source-compatible; exit
|
|
|
10
10
|
|
|
11
11
|
The manifest is generated and owned by Campaign Cart, from its storage registry. The scanner has no independent SDK key list and fetches no remote code. Supply `docs/compatibility/storage-migrations.v1.json` from an unmodified checkout of a Campaign Cart release tag, v0.4.40 or later. The report records the full file SHA-256, SDK version, supported target range, registry/extractor/input digest, and Git provenance. When the supplied bytes equal their repository HEAD blob, provenance is `verified-git-blob` with commit and repository path. Proposed, modified, or copied manifests are labeled `unverified-local-file`; the label never certifies a release. Review/pin SDK provenance separately before acting on findings. A release manifest covers the target range it declares, which may end below its own SDK version: the v0.4.40 manifest, for example, covers 0.4.38 only. Targets outside the manifest's supported SDK range report unknown. A manifest whose SDK version is below its supported maximum is invalid.
|
|
12
12
|
|
|
13
|
-
`--target` must name the Git root. `--scope` is mandatory: comma-separated literal repository-relative directory/file paths; use `.` only when the complete repository is intended. Add shared JavaScript directories explicitly. `--exclude` uses the same syntax and records explicit exclusions. Archives receive no implicit exemption. Only Git-tracked `.html`, `.htm`, `.js`, `.mjs`, and `.cjs` files in the selected scope are scanned, using current working-tree bytes and per-file digests; untracked files and built dependencies are outside this evidence. A selected HTML page's local script outside the selected files reports unknown. Relative scripts affected by an HTML `<base href>` also report unknown; review their actual dependency paths. Remote SDK and third-party scripts are not fetched or analyzed.
|
|
13
|
+
`--target` must name the Git root. `--scope` is mandatory: comma-separated literal repository-relative directory/file paths; use `.` only when the complete repository is intended. Add shared JavaScript directories explicitly. `--exclude` uses the same syntax and records explicit exclusions. Archives receive no implicit exemption. Only Git-tracked `.html`, `.htm`, `.js`, `.mjs`, and `.cjs` files in the selected scope are scanned, using current working-tree bytes and per-file digests; untracked files and built dependencies are outside this evidence. A selected HTML page's local script outside the selected files reports unknown. In a Page Kit campaign (a page under `src/<slug>/`), a script src written `{{ 'js/x.js' | campaign_asset }}` resolves to `src/<slug>/assets/js/x.js`, as Page Kit serves it, and a page's frontmatter `scripts:` entries resolve the same way, since a layout's `{% for script in scripts %}` loop loads them through that filter. Any other `campaign_asset` value, a path that resolves outside the assets folder, and frontmatter that is not valid YAML or whose `scripts` is not a list of paths report unknown. Relative scripts affected by an HTML `<base href>` also report unknown; review their actual dependency paths. Remote SDK and third-party scripts are not fetched or analyzed.
|
|
14
14
|
|
|
15
15
|
Acorn parses JavaScript ASTs; parse5 identifies executable inline HTML scripts and source offsets. Findings inventory storage area, operation, key, file/line/column, reason, and SDK-owned public replacement when supplied. The scanner recognizes direct `localStorage`/`sessionStorage`, `window`/`globalThis`/`self` properties, simple constant browser-global/storage aliases and storage destructuring, literal `getItem`/`setItem`/`removeItem` calls (including bracket method notation), property access/assignment/deletion, and lexical constant string indirection. Comments, ordinary strings, JSON script blocks and public store calls do not become storage reads. A literal legacy SDK key at or after its manifest migration boundary is incompatible. Guessed prefixes cannot establish compatibility.
|
|
16
16
|
|
package/docs/skills-revision.md
CHANGED
|
@@ -16,7 +16,7 @@ that the copy on disk moved.
|
|
|
16
16
|
`skills.json` carries one top-level field:
|
|
17
17
|
|
|
18
18
|
```json
|
|
19
|
-
"bundle_revision": "1.
|
|
19
|
+
"bundle_revision": "1.53.0+skills.2"
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
The spelling is `<package version>+skills.<n>`:
|
|
@@ -25,7 +25,7 @@ The spelling is `<package version>+skills.<n>`:
|
|
|
25
25
|
skills ship with (`check-skill-versions.mjs` fails if the two disagree);
|
|
26
26
|
- `<n>` is a plain counter, not a semver component. It says "this is the *n*th
|
|
27
27
|
skill-text revision published against that package version" and it **resets
|
|
28
|
-
with the prefix**. `1.
|
|
28
|
+
with the prefix**. `1.53.0+skills.1` is therefore ahead of `1.40.0+skills.7`.
|
|
29
29
|
|
|
30
30
|
It is one identity for the bundle as a whole, on purpose. Per-skill versions
|
|
31
31
|
still exist and still gate per-skill changes, but an agent that loaded one skill
|
|
@@ -37,7 +37,7 @@ The first body line of every bundled `SKILL.md`, immediately after the
|
|
|
37
37
|
frontmatter, is exactly:
|
|
38
38
|
|
|
39
39
|
```
|
|
40
|
-
Bundle revision: 1.
|
|
40
|
+
Bundle revision: 1.53.0+skills.2
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
followed by a short paragraph telling the agent to run the check below at the
|
|
@@ -48,7 +48,7 @@ text the agent is actually reading, not from a file it would have to go and open
|
|
|
48
48
|
## The check
|
|
49
49
|
|
|
50
50
|
```bash
|
|
51
|
-
npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
51
|
+
npx --no-install campaigns-os tooling status --skills-revision 1.53.0+skills.2
|
|
52
52
|
```
|
|
53
53
|
|
|
54
54
|
The value is compared against the bundle revision of the **CLI the command runs
|
|
@@ -90,20 +90,20 @@ reports the choice as `skills.scope` (`requested`, `installed_platforms`, or
|
|
|
90
90
|
"revision_check": "match",
|
|
91
91
|
"skills_revision": {
|
|
92
92
|
"status": "match",
|
|
93
|
-
"requested": "1.
|
|
93
|
+
"requested": "1.53.0+skills.2",
|
|
94
94
|
"spelling": "bundle",
|
|
95
|
-
"on_disk": "1.
|
|
95
|
+
"on_disk": "1.53.0+skills.2",
|
|
96
96
|
"on_disk_skill": null,
|
|
97
|
-
"message": "match (1.
|
|
97
|
+
"message": "match (1.53.0+skills.2)"
|
|
98
98
|
}
|
|
99
99
|
```
|
|
100
100
|
|
|
101
101
|
The text view prints one named line, as a header above the rest of the status:
|
|
102
102
|
|
|
103
103
|
```
|
|
104
|
-
Skills revision: match (1.
|
|
105
|
-
Skills revision: mismatch: loaded 1.39.0+skills.1, on disk 1.
|
|
106
|
-
Skills revision: unchecked (on disk 1.
|
|
104
|
+
Skills revision: match (1.53.0+skills.2)
|
|
105
|
+
Skills revision: mismatch: loaded 1.39.0+skills.1, on disk 1.53.0+skills.2 — start a fresh session
|
|
106
|
+
Skills revision: unchecked (on disk 1.53.0+skills.2)
|
|
107
107
|
```
|
|
108
108
|
|
|
109
109
|
`unchecked` is the state when the flag is absent. It is not an error — an
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: campaign-lifecycle-orientation
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.29
|
|
4
4
|
description: Orient a reader to the Campaigns OS lifecycle artifacts a run has already emitted, without advancing any stage or changing any state.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.53.0+skills.2
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.53.0+skills.2`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: campaign-readback-classification
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.29
|
|
4
4
|
description: Classify a selected campaign from the readback projection's v2 fields and write a read-only handoff without turning diagnosis into permission.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.53.0+skills.2
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.53.0+skills.2`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: campaign-run-evidence
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.29
|
|
4
4
|
description: Interpret existing Campaigns OS doctor, QA and proof-depth evidence without claiming more proof than the artifacts contain.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.53.0+skills.2
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.53.0+skills.2`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: contribution-intake
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.29
|
|
4
4
|
description: Turn a suggestion about the agent surface into a classified, evidence-checked proposal and, only with attended approval, one issue on this repository's tracker.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.53.0+skills.2
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.53.0+skills.2`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: next-campaigns-build
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.34
|
|
4
4
|
description: Assemble a NEXT campaign from a doctor-cleared Build Packet, CampaignSpec/API values, prepared HTML/assets, page-kit, and starter-template contracts.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.53.0+skills.2
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.53.0+skills.2`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|
|
@@ -75,6 +75,7 @@ Inputs:
|
|
|
75
75
|
- prepared HTML/assets source
|
|
76
76
|
- target page-kit repo
|
|
77
77
|
- starter-template commerce catalog
|
|
78
|
+
- Read the normalized Campaign Build Brief at `.campaign-runtime/input/campaign-build-brief.normalized.json` and the recorded decisions (`adapter_decisions`, `decisions` and `theme` in `.campaign-runtime/assembly-report.json`, and `assembly.template_decision_notes` in the Build Packet) before working on the campaign. The campaign intent summary at the top of the setup, build, Polish and QA prompts and in every `next` result is orientation, never a source of prices or commerce behaviour.
|
|
78
79
|
|
|
79
80
|
Build rules:
|
|
80
81
|
|
|
@@ -106,6 +107,7 @@ Build rules:
|
|
|
106
107
|
- For `shop-three-step`, shipping methods are dynamic through `window.next.getShippingMethods()`; do not add static Olympus-style `shipping_methods` frontmatter.
|
|
107
108
|
- Run page-kit build and SDK/template lint available in the target repo.
|
|
108
109
|
- Record build with `campaigns-os record build --packet <packet>` after every page-kit build (tier `C`: it overwrites `stages.assembly` and, when the output changed, resets `stages.polish` to `required` in the assembly report, and stamps the doctor output stale; `--dry-run` is tier `none`). It stamps `stages.assembly.build_fingerprint` with the fingerprint doctor computes from `_site/<slug>/` and the Design Source Package material fingerprint when the report has one. Never type or copy these fields by hand.
|
|
110
|
+
- If `next` reports that the build output is unchanged after a brief or CampaignSpec change, rebuild so the change reaches the pages. Pass `--deviation-reason` to `record build` only when the operator explicitly decides in this conversation that the change needs no change to the built pages, and quote their reason.
|
|
109
111
|
- Capture the machine-readable build summary as an artifact: `npx campaign-build --json > .campaign-runtime/page-kit-build-summary.json` (requires `next-campaign-page-kit` >= 0.1.4). Doctor's `built_output.build_summary` check verifies per-page build status and Page Kit shape warnings (`NESTED_NO_PERMALINK`, `DUPLICATE_OUTPUT`, `MISSING_FRONTMATTER`, `LAYOUT_NOT_FOUND`, `NO_CAMPAIGN`) from this artifact. If the installed page-kit predates `--json`, record that in the assembly report instead of skipping silently.
|
|
110
112
|
- Update the assembly report with commands, evidence, warnings, blockers, and next owner. If a brand theme was applied, run `campaigns-os record theme --packet <p>` (tier `C`) after `record build`: it reads each built commerce page's stylesheet links and records `report.theme` (status applied, `load_order=after-next-core`, `css_path`, `commerce_pages`, evidence). It refuses, writing nothing, when a page that loads `next-core.css` does not load the brand layer after it. Don't hand-edit `report.theme`; a first repair-loop defect goes through `record polish`.
|
|
111
113
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: next-campaigns-os
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.49
|
|
4
4
|
description: Coordinate Campaigns OS lifecycle workflows from CampaignSpec, Build Packet, starter-template contracts, stage reports, deploy evidence, and QA proof depth.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.53.0+skills.2
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.53.0+skills.2`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|
|
@@ -95,7 +95,7 @@ Map and run endpoints) with a local CampaignSpec, prepared HTML/assets source, t
|
|
|
95
95
|
retains each attributed exception as `ready_with_exceptions`, and one
|
|
96
96
|
exception never suppresses another blocker.
|
|
97
97
|
10. Run the package-owned proof path in sequence: ensure `npx --no-install campaigns-os qa install-browser` has completed, run `campaigns-os qa resolve --packet <packet>` (tier `A`: it fetches `--base-url`; `--no-probe` is tier `B` and local), then `campaigns-os qa run --packet <packet> --base-url <url> --browser --test-order common` (tier `C`: it overwrites the stored verdict and assembly report, places real typed-card test orders against the campaign, and posts the verdict and progress; `--no-post-verdict` drops the verdict POST and `--no-remit` the Run Record remit, but both stay tier `C`).
|
|
98
|
-
11. Treat typed-card proof coverage as the control.
|
|
98
|
+
11. Treat typed-card proof coverage as the control: `qa run` has no permission flag. Test orders still land in the store as real orders (global test cards: no charge, no transaction) that someone may have to cancel. Unless the operator has already said test orders are fine for this campaign, ask once, up front in your first turn with your other setup questions, so the answer covers the whole build and QA and neither stops for it later. `common` runs every actual terminal path when they fit under the flood cap (`--max-test-orders`, 6 by default); above the cap it runs checkout, 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.
|
|
99
99
|
12. Discuss launch only from recorded build, polish, deploy, browser QA, and test-order evidence, or from explicit blockers.
|
|
100
100
|
|
|
101
101
|
## Session Intake
|
|
@@ -103,31 +103,22 @@ Map and run endpoints) with a local CampaignSpec, prepared HTML/assets source, t
|
|
|
103
103
|
When a Campaigns OS session starts, classify the starting path before handing
|
|
104
104
|
off to setup, build, polish, QA, or promotion. The operator should separate:
|
|
105
105
|
|
|
106
|
-
-
|
|
106
|
+
- Work: build, partial page update, existing campaign update, QA only, repair from verdict, design/source assembly, or promotion.
|
|
107
107
|
- Source truth: CampaignSpec/Map Builder export, Figma/design file, prepared HTML, existing campaign repo, deployed URL, or target deployment system.
|
|
108
108
|
- Runtime truth: Build Packet, Build Context, Assembly Report, doctor JSON, tested URL, API key source, and SDK origin allowlist state (localhost is already a Development domain; non-localhost origins still need confirmation).
|
|
109
109
|
- Change policy: what may change and what must be preserved, especially checkout, offer logic, routes, legal copy, and live campaign behavior.
|
|
110
|
-
- Proof
|
|
110
|
+
- Proof policy: visual preview, doctor, browser QA, QA portal/local verdict policy, typed-card test-order depth, market coverage, and repair routing.
|
|
111
111
|
|
|
112
|
-
Return
|
|
113
|
-
|
|
114
|
-
```text
|
|
115
|
-
Mode:
|
|
116
|
-
Intent:
|
|
117
|
-
Source truth:
|
|
118
|
-
Runtime truth:
|
|
119
|
-
Change policy:
|
|
120
|
-
Proof depth:
|
|
121
|
-
Next skill/command:
|
|
122
|
-
Missing inputs:
|
|
123
|
-
```
|
|
112
|
+
Return the compact brief defined in `references/session-intake.md` before acting.
|
|
124
113
|
|
|
125
114
|
Use `references/session-intake.md` when the mode, allowed changes, or proof
|
|
126
|
-
|
|
115
|
+
policy is unclear. Ask only for fields needed by the selected starting path; a
|
|
127
116
|
QA-only session should not require design files, and a partial landing update
|
|
128
117
|
should not force full checkout/test-order depth unless commerce or routing can be
|
|
129
118
|
affected.
|
|
130
119
|
|
|
120
|
+
Save the operator's brief answers with `campaigns-os record brief --packet <packet>` (tier `C`: when the brief changes it rewrites the Build Packet's brief binding, the normalized brief, the Build Context and the assembly report and stamps the doctor output stale, and a material change makes build, Polish and QA owed again; `--dry-run` is tier `none`). Ask the operator before saving brief answers. Put the answers in the brief file as `docs/campaign-build-brief.md` describes, then run `record brief`; do not re-run `start` or `prepare-build` to save them.
|
|
121
|
+
|
|
131
122
|
Rules:
|
|
132
123
|
|
|
133
124
|
- This is contract-backed guidance and preflight, not full automated readiness.
|
|
@@ -140,7 +131,7 @@ Rules:
|
|
|
140
131
|
- Promoted starter-template families must also have `contracts/template-brand-contract.<family>.v0.json` with family inventory, brand/residue, pricing, and exit-pop rules. Missing family contracts are gates, not advisory gaps.
|
|
141
132
|
- Designed source owns visual composition and page-level content.
|
|
142
133
|
- Brand-theme evidence is workflow-order neutral. Do not assume a Figma export came first; consume `context.theme` and `.campaign-runtime/theme/theme-report.json` when present. A truly missing/ungeneratable theme stays a warning, but a generatable-and-unapplied theme on a commerce-page campaign is a gate: apply it or waive it explicitly before polish/deploy/QA.
|
|
143
|
-
- Follow `campaigns-os next` literally. Every `next` response carries its applicable Store Profile, SDK, hidden eager-media, theme, and broad Polish gates plus `next_actions` with exact commands — execute those instead of improvising. With an active run session, pipeline-advancing commands that don't match the last `next` recommendation are recorded to `.campaign-runtime/agent-deviations.jsonl`; declare
|
|
134
|
+
- Follow `campaigns-os next` literally. Every `next` response carries its applicable Store Profile, SDK, hidden eager-media, theme, and broad Polish gates plus `next_actions` with exact commands — execute those instead of improvising. With an active run session, pipeline-advancing commands that don't match the last `next` recommendation are recorded to `.campaign-runtime/agent-deviations.jsonl`; declare a detour with `--deviation-reason "<the operator's reason>"` only when the operator has decided on that detour in this conversation, and quote their reason; never pass the flag on your own judgement. On `record build` after a brief or CampaignSpec change the flag records that the change needs no change to the built pages, so pass it there only on the operator's explicit decision, as `next-campaigns-build` says.
|
|
144
135
|
- Close the loop: when `next` reports `done` (or QA has published its verdict and the PR is up), finish with `campaigns-os run end` (tier `C`; `--no-write` still clears the session file) so the Run Record is assembled and the run session clears. `campaigns-os run status` (tier `none`: read-only) shows incomplete stages and the exact next command at any point.
|
|
145
136
|
- Do not copy demo refs or unsupported optional surfaces into the target campaign.
|
|
146
137
|
- Use SDK conditionals such as `cart.hasCoupon("CODE")` for code-specific presentation; do not mutate visible prices from campaign-specific JavaScript.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Use this reference when a Campaigns OS session begins without an already-clear
|
|
4
4
|
Build Packet, QA verdict, or promotion task. The goal is to make the operator
|
|
5
|
-
separate
|
|
5
|
+
separate the work, source truth, runtime truth, change policy, and proof policy.
|
|
6
6
|
|
|
7
7
|
## Intake Envelope
|
|
8
8
|
|
|
@@ -10,27 +10,31 @@ Return this compact brief before running a specialist skill or command:
|
|
|
10
10
|
|
|
11
11
|
```text
|
|
12
12
|
Mode:
|
|
13
|
-
Intent
|
|
13
|
+
Work: (build, update, QA, repair, promote — the session's task; formerly "Intent")
|
|
14
|
+
Campaign: (paste the "Campaign intent" lines from the latest `next` output; do not write your own)
|
|
14
15
|
Source truth:
|
|
15
16
|
Runtime truth:
|
|
16
17
|
Change policy:
|
|
17
18
|
Proof policy:
|
|
18
19
|
Next skill/command:
|
|
19
|
-
Missing inputs:
|
|
20
|
+
Missing inputs: (only choices that affect this revision)
|
|
20
21
|
```
|
|
21
22
|
|
|
22
23
|
Definitions:
|
|
23
24
|
|
|
24
|
-
-
|
|
25
|
+
- Work: what the user wants done, such as build, update, QA, repair, or promote.
|
|
26
|
+
- Campaign: the "Campaign intent" lines from the latest `next` output, pasted as printed. They come from the normalized Campaign Build Brief; do not write your own.
|
|
25
27
|
- Source truth: CampaignSpec/Map Builder export, Figma/design file, prepared HTML, existing campaign, target repo, or deployed URL.
|
|
26
28
|
- Runtime truth: Build Packet, Build Context, Assembly Report, optional `context.theme` / `.campaign-runtime/theme/theme-report.json`, doctor JSON, repo state, tested URL, Campaigns API key source, SDK origin state (localhost is a Development domain; non-localhost origins need allowlist confirmation), and test-order depth choice.
|
|
27
29
|
- Change policy: what may change and what must be preserved, especially checkout, offer logic, live campaign routes, and legal/merchant copy.
|
|
28
|
-
- Proof
|
|
30
|
+
- Proof policy: visual preview, doctor, browser QA, QA portal/local verdict policy, typed-card test-order depth, market coverage, and repair routing.
|
|
29
31
|
|
|
30
32
|
Ask only for the fields needed by the selected mode. Do not force a full-funnel
|
|
31
33
|
build prompt when the user only needs QA, a partial page update, or repair from
|
|
32
34
|
an existing verdict.
|
|
33
35
|
|
|
36
|
+
Save the operator's brief answers with `npx --no-install campaigns-os record brief --packet <packet>` (tier `C`: when the brief changes it rewrites the Build Packet's brief binding, the normalized brief, the Build Context and the assembly report and stamps the doctor output stale, and a material change makes build, Polish and QA owed again; `--dry-run` is tier `none`). Ask the operator before saving brief answers. Put the answers in the brief file as `docs/campaign-build-brief.md` describes, then run `record brief`; do not re-run `start` or `prepare-build` to save them.
|
|
37
|
+
|
|
34
38
|
## Starting Paths
|
|
35
39
|
|
|
36
40
|
### Full Campaign Build
|
|
@@ -45,7 +49,7 @@ Required before build:
|
|
|
45
49
|
- Source type and source files: Figma, exported HTML, prepared HTML, existing campaign, or other.
|
|
46
50
|
- Pages in scope and any pages to preserve.
|
|
47
51
|
- Template family if known; otherwise infer and ask before locking commerce surfaces.
|
|
48
|
-
- Proof
|
|
52
|
+
- Proof policy, including browser QA and the typed-card test-order depth to run.
|
|
49
53
|
|
|
50
54
|
Route to Build Packet preparation, doctor, setup when scaffold is missing,
|
|
51
55
|
build, polish, then QA.
|
|
@@ -141,9 +145,13 @@ hand-edit deployed routing config as the primary promotion path.
|
|
|
141
145
|
|
|
142
146
|
## Test-Order Proof Policy
|
|
143
147
|
|
|
144
|
-
Treat test orders as
|
|
145
|
-
|
|
146
|
-
|
|
148
|
+
Treat test orders as repeatable proof. `qa run` has no permission flag:
|
|
149
|
+
coverage is its only control. Test orders still land in the store as real
|
|
150
|
+
orders (global test cards: no charge, no transaction) that someone may have to
|
|
151
|
+
cancel. Unless the operator has already said test orders are fine for this
|
|
152
|
+
campaign, ask once, up front in your first turn with your other setup questions,
|
|
153
|
+
so the answer covers the whole build and QA and neither stops for it later.
|
|
154
|
+
Record:
|
|
147
155
|
|
|
148
156
|
- Coverage: `common` (every actual terminal path when they fit under the flood cap; above it, checkout, first-offer accept/decline, a deduplicated shortest real receipt path, and one decline path per offer or downsell page not yet declined, up to the cap), `off`, `checkout`, `decline`, `accept`, `both`, `full`, or explicit paths such as `decline-decline-accept`.
|
|
149
157
|
- Cart matrix: base cart, base plus bump, specific package refs/quantities.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: next-campaigns-os-setup
|
|
3
|
-
version: 2.0.
|
|
3
|
+
version: 2.0.32
|
|
4
4
|
description: Bootstrap or prepare a target page-kit campaign repo from a doctor-cleared Campaigns OS Build Packet before full build wiring. Formerly installed as next-campaigns-setup; renamed 2026-08 to stop colliding with the published NextCommerceCo/skills scaffolder of that name.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.53.0+skills.2
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.53.0+skills.2`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|
|
@@ -52,6 +52,7 @@ Responsibilities:
|
|
|
52
52
|
- When copying a selected starter template family, copy the family as an atomic page-kit slice: pages plus required `_includes/`, `_layouts/`, `assets/css/`, and `assets/js/`. Do not copy only `checkout.html` and `receipt.html`.
|
|
53
53
|
- Public families resolve from the default `public` starter-templates source. A **private** family (one whose source lives in an access-controlled repo, e.g. a certified family not present in the public picker) is scaffolded via page-kit's template-source mechanism (`next-campaign-page-kit` >= 0.2.0): add a named source to the target repo's `_data/template-sources.json` (a `git` source with the SSH `url` + optional `ref`, or a `local` source `path`), then `campaign-init --source <name> --template <slug>`. The source repo must expose a root `templates.json` catalog + `src/<slug>/` tree. page-kit holds no family→repo mapping; the source config lives in the (private) consuming repo, and this skill (plus the family's certified contract) is where that source is known.
|
|
54
54
|
- Install or reference `.campaign-runtime/agent-context` without overwriting existing root agent files.
|
|
55
|
+
- Read the normalized Campaign Build Brief at `.campaign-runtime/input/campaign-build-brief.normalized.json` and the recorded decisions (`adapter_decisions`, `decisions` and `theme` in `.campaign-runtime/assembly-report.json`, and `assembly.template_decision_notes` in the Build Packet) before working on the campaign. The campaign intent summary at the top of the setup, build, Polish and QA prompts and in every `next` result is orientation, never a source of prices or commerce behaviour.
|
|
55
56
|
- Record setup with `campaigns-os record setup --packet <packet>` once the campaign output directory exists (tier `C`: it overwrites `stages.setup` in `.campaign-runtime/assembly-report.json` and the `scaffold` block of `.campaign-runtime/build-context.json`, and stamps the doctor output stale; `--dry-run` is tier `none`). It sets `scaffold.required` to false and `stages.setup` to completed, validates both files against their schemas, and writes nothing when a check fails. Do not hand-edit either file.
|
|
56
57
|
- Preserve existing Build Context `theme` inspection data and Assembly Report `theme` application data when setup is rerun against an existing campaign directory.
|
|
57
58
|
- Hand off to `next-campaigns-build`.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: next-campaigns-polish
|
|
3
|
-
version: 1.1.
|
|
3
|
+
version: 1.1.33
|
|
4
4
|
description: Run the visual/runtime polish pass after build and before QA for a Campaigns OS campaign.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.53.0+skills.2
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.53.0+skills.2`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|
|
@@ -59,6 +59,7 @@ Responsibilities:
|
|
|
59
59
|
- Scan **visible** rendered text inside the family's content/commerce surfaces (the selectors enumerated in `contracts/template-brand-contract.<family>.v0.json`) for placeholder/residue copy the build should have replaced — the *literal starter defaults*: lorem-ipsum, the unmodified starter headings (`Product Name` / `Package Title` / `Your headline`), `[VERIFY …]` author notes, `TODO` markers. Match the literal starter strings, not any authored copy that merely contains those words, and skip `<script>` / `<style>` / JSON-LD / `data-*` attributes. Treat a surviving literal starter default on a content/commerce surface as a polish blocker — replace it from the prepared source / CampaignSpec; do not draft substitute copy (if the design's authored copy is genuinely missing, flag it rather than invent it). This is *copy* residue, complementary to the computed-style / asset residue gated by `next-campaigns-qa` + the brand contract — not a duplicate of it.
|
|
60
60
|
- Flag template *defaults* left where they disagree with the prepared design — e.g. the same benefit icon repeated across a grid *when the design uses distinct icons*, or a guarantee badge/term that disagrees with the design — as polish defects, not just logos. Judge against the prepared source, not taste: copy or imagery the source/CampaignSpec does not supply (e.g. a placeholder testimonial name/quote/role) is residue; "looks generic" on its own is not. Copy the source does supply, including its proof and urgency elements (reviews, "Verified Purchase" labels, recent-purchase popups, stock counters, countdowns, guarantees), is the merchant's content: keep it as designed and do not record it as an issue or an unconfirmed claim.
|
|
61
61
|
- **Brand-bleed (cloned-source de-brand) pass.** When a campaign is cloned from a proven sibling, the sibling's brand defaults ride along. Inspect the built pages and assets for residual cross-brand bleed and clear it before recording: (1) a residual promo/sale banner or coupon code/copy from the source campaign (including a baked-in *fake* code); (2) a prior-campaign / sibling favicon left in place; (3) scaffold or non-design fonts the design did not specify (e.g. starter `Plus Jakarta`); (4) hardcoded non-token colors — any brand color literal that should be a token, such as next-core's `#C670FE` "Most Popular" pill. Clear each from the prepared source / CampaignSpec and brand theme (tokens, not literals); flag — do not invent — anything the design genuinely doesn't supply. Treat surviving bleed as a polish blocker. This complements the favicon/logo and copy-residue checks above; it is the cross-brand contamination angle, not a duplicate.
|
|
62
|
+
- Read the normalized Campaign Build Brief at `.campaign-runtime/input/campaign-build-brief.normalized.json` and the recorded decisions (`adapter_decisions`, `decisions` and `theme` in `.campaign-runtime/assembly-report.json`, and `assembly.template_decision_notes` in the Build Packet) before working on the campaign. The campaign intent summary at the top of the setup, build, Polish and QA prompts and in every `next` result is orientation, never a source of prices or commerce behaviour.
|
|
62
63
|
- Read the assembly report decisions before polishing. Do not reintroduce source-HTML elements that build intentionally dropped because CampaignSpec/API did not support them, such as unavailable payment methods.
|
|
63
64
|
- **Remove or rename a contract-listed payment-chrome asset; never edit one in place.** The assets named in `contracts/template-brand-contract.<family>.v0.json` under `default_residue.payment_chrome.assets` are keyed by QA on the *referenced basename*, not on their contents. Stripping the unsupported marks from inside a shared file such as `upsell-payment-logos.svg` leaves the reference in place, so QA reports residue for an asset that no longer carries any — and on 2026-09-06 the repair loop's remedy for that report deleted a cards-only trust strip that was correct. Delete the asset, or write a new one under a new name and repoint the reference. QA downgrades an edited-in-place asset to `manual_review` rather than a blocker, but that is a safety net for a mistake, not the supported way to do this.
|
|
64
65
|
- Preserve existing `report.theme` data. If polish changes generated theme CSS, load order, commerce-page coverage, theme warnings, or the first repair-loop defect, update the Assembly Report `theme` block rather than leaving stale evidence.
|
|
@@ -78,13 +79,14 @@ Responsibilities:
|
|
|
78
79
|
The package captures every mapped route at fixed desktop/mobile viewports and
|
|
79
80
|
attaches `stages.polish.evidence.visual_review.page_load`. Never hand-author,
|
|
80
81
|
copy, or repair that object directly.
|
|
82
|
+
- When a readability warning appears, report it with its colours, ratio, requirement and pages. Offer the operator options inside the brand palette (a darker or lighter shade of the same hue, the palette's text colour, or a larger, bold label where the design allows). Do not recolour the merchant's design until the operator chooses. Accept a warning only with the refs, reason and name the operator gives you at the QC handoff.
|
|
81
83
|
- Record Polish as `completed`, `skipped`, or `blocked` with
|
|
82
84
|
`campaigns-os record polish --packet <packet> --evidence <polish-evidence.json>`
|
|
83
85
|
(tier `C`: it overwrites `stages.polish` in the assembly report and stamps the
|
|
84
86
|
doctor output stale; `--dry-run` is tier `none`). A nonzero capture result keeps
|
|
85
87
|
Polish blocked until repair and recapture. The
|
|
86
88
|
producer persists bounded incomplete evidence for diagnosis and does not mark
|
|
87
|
-
the stage complete.
|
|
89
|
+
the stage complete. Record Polish as `skipped` only when the operator decides in this conversation to skip it, and quote their reason as `skip_reason`.
|
|
88
90
|
- Use `npm run smoke:polish-capture` only as an optional local producer smoke
|
|
89
91
|
after browser installation. It opens a loopback fixture server and is not
|
|
90
92
|
part of `npm run check` or the CI browser lane.
|
|
@@ -138,7 +140,7 @@ A Polish that cannot complete is recorded with the same command: a file with
|
|
|
138
140
|
`"status": "blocked"` and `blockers` (a non-empty array of `{"code", "message"}`
|
|
139
141
|
objects), or `"status": "skipped"` and a `skip_reason` string. `evidence` is
|
|
140
142
|
optional for both; the captured evidence stays. Either keeps `next` at Polish
|
|
141
|
-
and QA blocked until a completed Polish is recorded.
|
|
143
|
+
and QA blocked until a completed Polish is recorded. Record Polish as `skipped` only when the operator decides in this conversation to skip it, and quote their reason as `skip_reason`.
|
|
142
144
|
|
|
143
145
|
The `polish.hidden_eager_media` checkpoint blocks on nonwaivable missing,
|
|
144
146
|
malformed, stale, integrity-invalid, route-mismatched, or incomplete package
|