@nextcommerce/campaigns-os 1.41.2 → 1.43.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/CHANGELOG.md +178 -0
  2. package/README.md +6 -4
  3. package/agents/claude/CLAUDE.md +5 -1
  4. package/campaign-spec/dist/types.d.ts +2 -0
  5. package/contracts/effects.v1.json +111 -18
  6. package/contracts/migration-sidecar-bundle.v0.json +9 -0
  7. package/contracts/release-ledger.json +752 -0
  8. package/contracts/supported-surface.json +12 -11
  9. package/docs/build-packet.md +56 -6
  10. package/docs/campaigns-os-build-flow.md +2 -2
  11. package/docs/effects.md +70 -1
  12. package/docs/local-setup.md +51 -0
  13. package/docs/migration-sidecar-bundle.md +6 -1
  14. package/docs/orientation-contract-reference.md +1 -1
  15. package/docs/progress-snapshots.md +6 -0
  16. package/docs/qa-and-test-orders.md +26 -10
  17. package/docs/runtime-readiness.md +1 -1
  18. package/docs/skills-revision.md +10 -10
  19. package/package.json +3 -2
  20. package/schemas/campaign-runtime-assembly-report.v0.schema.json +6 -1
  21. package/schemas/campaign-runtime-build-packet.v0.schema.json +6 -1
  22. package/schemas/campaign-spec.v4.schema.json +4 -0
  23. package/schemas/campaigns-os-progress-snapshot.v0.schema.json +1 -0
  24. package/schemas/campaigns-os-qa-verdict-sidecar.v0.schema.json +1 -0
  25. package/schemas/campaigns-os-qa-verdict.v0.schema.json +1 -0
  26. package/schemas/campaigns-os-run-record.v0.schema.json +1 -0
  27. package/skills/campaign-lifecycle-orientation/SKILL.md +13 -8
  28. package/skills/campaign-readback-classification/SKILL.md +3 -3
  29. package/skills/campaign-run-evidence/SKILL.md +8 -6
  30. package/skills/contribution-intake/SKILL.md +3 -3
  31. package/skills/next-campaigns-build/SKILL.md +3 -3
  32. package/skills/next-campaigns-os/SKILL.md +17 -4
  33. package/skills/next-campaigns-os/references/session-intake.md +4 -4
  34. package/skills/next-campaigns-os-setup/SKILL.md +3 -3
  35. package/skills/next-campaigns-polish/SKILL.md +3 -3
  36. package/skills/next-campaigns-qa/SKILL.md +10 -9
  37. package/skills.json +11 -11
  38. package/src/cli.mjs +187 -70
  39. package/src/finding-cause.mjs +14 -10
  40. package/src/lifecycle.mjs +5 -4
  41. package/src/polish-node.mjs +5 -2
  42. package/src/progress-node.mjs +3 -2
  43. package/src/progress.mjs +5 -3
  44. package/src/qa-node.mjs +58 -26
  45. package/src/qa-publish.mjs +4 -0
  46. package/src/qa-sidecar.mjs +2 -0
  47. package/src/qa-verdict-discovery.mjs +11 -0
  48. package/src/qa-verdict-publish.mjs +1 -0
  49. package/src/qa-verdict.mjs +8 -1
  50. package/src/readback.mjs +2 -1
  51. package/src/run-record-closeout.mjs +3 -4
  52. package/src/run-record.mjs +4 -0
  53. package/src/sidecar-bundle.mjs +21 -0
  54. package/src/spec-source-identity.mjs +44 -0
  55. package/src/stage-ledger.mjs +4 -1
  56. package/src/tooling-setup.mjs +160 -0
@@ -6,6 +6,8 @@
6
6
  "type": "object",
7
7
  "additionalProperties": true,
8
8
  "required": ["schema_version", "funnels"],
9
+ "if": { "required": ["spec_identity"], "properties": { "spec_identity": { "required": ["local_spec_id"] } } },
10
+ "then": { "not": { "required": ["map_id"] } },
9
11
  "properties": {
10
12
  "schema_version": {
11
13
  "enum": ["4.2", "4.3"],
@@ -364,8 +366,10 @@
364
366
  "specIdentity": {
365
367
  "type": "object",
366
368
  "additionalProperties": true,
369
+ "not": { "required": ["map_id", "local_spec_id"] },
367
370
  "properties": {
368
371
  "source": { "type": "string", "description": "Observed values: campaign-map-builder, hand-authored-simulation, local-experimental." },
372
+ "local_spec_id": { "type": "string", "pattern": "^[A-Za-z0-9_-]{1,64}$", "description": "Stable repository-owned CampaignSpec identity; never a saved Map ID. Keep unchanged across local revisions." },
369
373
  "map_id": { "type": "string" },
370
374
  "id": { "type": "string" },
371
375
  "map_url": { "type": "string" },
@@ -71,6 +71,7 @@
71
71
  "build_fingerprint_algorithm"
72
72
  ],
73
73
  "properties": {
74
+ "local_spec_id": { "type": "string", "pattern": "^[A-Za-z0-9_-]{1,64}$" },
74
75
  "map_id": {
75
76
  "type": [
76
77
  "string",
@@ -29,6 +29,7 @@
29
29
  "description": "Same literal as the full verdict — the sidecar is the same contract projected, not a second schema lineage."
30
30
  },
31
31
  "run_id": { "type": "string", "minLength": 1 },
32
+ "local_spec_id": { "type": "string", "pattern": "^[A-Za-z0-9_-]{1,64}$", "description": "Stable repository-owned CampaignSpec identity; never a saved Map ID. Keep unchanged across local revisions." },
32
33
  "campaign_slug": {
33
34
  "type": "string",
34
35
  "minLength": 1,
@@ -29,6 +29,7 @@
29
29
  "minLength": 1,
30
30
  "description": "The QA run identity, also the verdict filename under qa-output/<map-id>/. The portal receiver additionally restricts it to [A-Za-z0-9_-]{1,64}."
31
31
  },
32
+ "local_spec_id": { "type": "string", "pattern": "^[A-Za-z0-9_-]{1,64}$", "description": "Stable repository-owned CampaignSpec identity; never a saved Map ID. Keep unchanged across local revisions." },
32
33
  "campaign_slug": {
33
34
  "type": "string",
34
35
  "minLength": 1,
@@ -155,6 +155,7 @@
155
155
  "additionalProperties": false,
156
156
  "description": "Best-effort run identity — the join keys that make telemetry useful. Missing identity never blocks capture.",
157
157
  "properties": {
158
+ "local_spec_id": { "type": ["string", "null"], "pattern": "^[A-Za-z0-9_-]{1,64}$", "description": "Stable repository-owned CampaignSpec identity; never a saved Map ID. Keep unchanged across local revisions. Null or omitted means no local identity." },
158
159
  "map_id": { "type": ["string", "null"] },
159
160
  "campaign_slug": { "type": ["string", "null"] },
160
161
  "template_family": { "type": ["string", "null"] },
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: campaign-lifecycle-orientation
3
- version: 1.0.3
3
+ version: 1.0.7
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.41.2+skills.1
8
- Run `npx --no-install campaigns-os tooling status --skills-revision 1.41.2+skills.1`
7
+ Bundle revision: 1.43.1+skills.1
8
+ Run `npx --no-install campaigns-os tooling status --skills-revision 1.43.1+skills.1`
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
@@ -70,9 +70,13 @@ output sidecar, theme evidence and normalized inputs
70
70
  separate system, and QA then tests a deployed URL
71
71
  (`docs/qa-and-test-orders.md`).
72
72
 
73
- Keep the two identities apart. The **Map ID** identifies the saved campaign map
74
- and keys QA evidence storage; the **public route slug** is the shopper-facing
75
- path segment. Read both from the packet and never substitute one for the other.
73
+ Keep stable campaign identity separate from routing. The **Map ID** identifies
74
+ a saved campaign map and keys its QA evidence storage. A local-spec packet
75
+ instead carries **local_spec_id**, keeps `map_id` null, and stores QA under
76
+ `local-spec-<local_spec_id>`. The **public route slug** is the shopper-facing
77
+ path segment. Read the packet's identity kind and route separately; a shared
78
+ route cannot make evidence from another local spec belong to this campaign
79
+ (`docs/build-packet.md`, "Local-spec entry").
76
80
 
77
81
  Campaign pages are typed. The page-type vocabulary is `presell`, `landing`,
78
82
  `select`, `checkout`, `upsell`, `downsell` and `thankyou`; `select` is where a
@@ -95,8 +99,9 @@ only from implementation files this skill may not cite, so do not branch on one.
95
99
  ## Read the stage record
96
100
 
97
101
  `campaigns-os next --packet <packet> --json` (tier `A`: it captures a progress
98
- snapshot under the target and, under Run Telemetry consent, POSTs that
99
- observation off the machine) reads the recorded state and names the next
102
+ snapshot under the target and, for saved-Map packets under Run Telemetry
103
+ consent, can POST that observation off the machine; local-spec observations
104
+ stay local) reads the recorded state and names the next
100
105
  incomplete stage among `setup`, `build`, `polish`, `deploy` and `qa`. That is a
101
106
  writing, potentially sending command. If all you need is where the run stands,
102
107
  prefer the readback below.
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: campaign-readback-classification
3
- version: 1.0.3
3
+ version: 1.0.7
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.41.2+skills.1
8
- Run `npx --no-install campaigns-os tooling status --skills-revision 1.41.2+skills.1`
7
+ Bundle revision: 1.43.1+skills.1
8
+ Run `npx --no-install campaigns-os tooling status --skills-revision 1.43.1+skills.1`
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
3
+ version: 1.0.7
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.41.2+skills.1
8
- Run `npx --no-install campaigns-os tooling status --skills-revision 1.41.2+skills.1`
7
+ Bundle revision: 1.43.1+skills.1
8
+ Run `npx --no-install campaigns-os tooling status --skills-revision 1.43.1+skills.1`
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,9 +59,11 @@ nothing about ordering — it records a policy and an unmet one.
59
59
 
60
60
  ## Interpret the verdict exactly
61
61
 
62
- Only a JSON QA verdict is a verdict. The runner writes its full verdict and
63
- attempts to publish it to the QA portal; a publication failure does not erase
64
- the local one. The readback projects `.campaign-runtime/qa-verdict.json` when
62
+ Only a JSON QA verdict is a verdict. The runner writes its full verdict locally.
63
+ Saved-Map QA may publish it under the existing consent and flag controls; a
64
+ publication failure does not erase the local one. Local-spec packet verdicts
65
+ stay local even with `--post-verdict`, and `qa publish` refuses those packets.
66
+ The readback projects `.campaign-runtime/qa-verdict.json` when
65
67
  that sidecar has been copied into the campaign repository. A markdown QA
66
68
  report, a ledger or a gate script is not a verdict and must not be scanned for
67
69
  a disposition, a run id or a blocker. Where two JSON verdicts exist, interpret
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: contribution-intake
3
- version: 1.0.3
3
+ version: 1.0.7
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.41.2+skills.1
8
- Run `npx --no-install campaigns-os tooling status --skills-revision 1.41.2+skills.1`
7
+ Bundle revision: 1.43.1+skills.1
8
+ Run `npx --no-install campaigns-os tooling status --skills-revision 1.43.1+skills.1`
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.8
3
+ version: 1.0.12
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.41.2+skills.1
8
- Run `npx --no-install campaigns-os tooling status --skills-revision 1.41.2+skills.1`
7
+ Bundle revision: 1.43.1+skills.1
8
+ Run `npx --no-install campaigns-os tooling status --skills-revision 1.43.1+skills.1`
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-os
3
- version: 1.0.23
3
+ version: 1.0.27
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.41.2+skills.1
8
- Run `npx --no-install campaigns-os tooling status --skills-revision 1.41.2+skills.1`
7
+ Bundle revision: 1.43.1+skills.1
8
+ Run `npx --no-install campaigns-os tooling status --skills-revision 1.43.1+skills.1`
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
@@ -60,7 +60,20 @@ but those wrappers should not redefine the public contract.
60
60
 
61
61
  Workflow:
62
62
 
63
- 1. Confirm the campaign was configured in Campaigns App and exported from Campaign Map Builder as current CampaignSpec JSON. Current authoring is v4.3+ while preserving the v4.2 `funnels[]` topology as the compatibility shape.
63
+ Local-spec runs use packet-based QA and repository evidence. They never post QA
64
+ to the Map portal or claim saved-Map revision alignment. Existing lifecycle
65
+ gates remain in force; use `local-serve` for the first localhost proof.
66
+
67
+ 1. Confirm the selected campaign is configured in Campaigns App. Use its current
68
+ saved Map export when available. For HTML-and-brief intake without a Map, author
69
+ a normal CampaignSpec from the source design, operator's brief and verified
70
+ Campaigns API commerce values. Follow `docs/build-packet.md` "Local-spec entry":
71
+ create one `spec_identity.local_spec_id` (UUID), preserve it through revisions,
72
+ set `public_route_slug`, and omit saved-Map identity/URLs. Do not ask the operator
73
+ to author a spec or fabricate a Map ID. Verify store/campaign binding and real
74
+ package/offer references. Store contact and policy details can come from the
75
+ brief; gateway access is optional. Current authoring is v4.3+ while preserving
76
+ the v4.2 `funnels[]` topology as the compatibility shape.
64
77
  2. Run `campaigns-os start` or `campaigns-os prepare-build` (tier `A`: they write the
65
78
  Build Packet, Build Context, assembly report, run session and `.gitignore` under
66
79
  the target plus a Run Record under the working directory, and they contact the
@@ -40,7 +40,7 @@ end-to-end campaign.
40
40
 
41
41
  Required before build:
42
42
 
43
- - Map ID or CampaignSpec path/URL.
43
+ - Saved Map ID/export, or the configured store/campaign details, public key, prepared HTML/assets and brief from which the agent authors a local CampaignSpec. Do not make a saved Map a prerequisite; follow `docs/build-packet.md` "Local-spec entry".
44
44
  - Public route slug and target repo/output directory.
45
45
  - Source type and source files: Figma, exported HTML, prepared HTML, existing campaign, or other.
46
46
  - Pages in scope and any pages to preserve.
@@ -101,10 +101,10 @@ Use when the user wants evidence on a deployed campaign and no source edit.
101
101
 
102
102
  Collect:
103
103
 
104
- - Map ID and deployed base URL.
105
- - Build Packet path if local; otherwise enough info to resolve topology.
104
+ - Saved Map ID or local-spec Build Packet, plus the tested base URL.
105
+ - Build Packet path; required for a local spec, otherwise enough info to resolve topology.
106
106
  - Whether browser QA should run.
107
- - Whether verdict should use the default QA portal publish path or stay local-only.
107
+ - For a saved Map, whether the verdict should use the QA portal publish path or stay local-only. Local-spec packet QA always keeps verdicts and progress local, even with `--post-verdict`; `qa publish` refuses it. Run Telemetry retains its consent controls.
108
108
  - Typed-card test-order depth (`common`/explicit/`full`).
109
109
 
110
110
  Route to QA. Do not patch campaign code from the QA-only path.
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: next-campaigns-os-setup
3
- version: 2.0.6
3
+ version: 2.0.10
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.41.2+skills.1
8
- Run `npx --no-install campaigns-os tooling status --skills-revision 1.41.2+skills.1`
7
+ Bundle revision: 1.43.1+skills.1
8
+ Run `npx --no-install campaigns-os tooling status --skills-revision 1.43.1+skills.1`
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-polish
3
- version: 1.1.7
3
+ version: 1.1.11
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.41.2+skills.1
8
- Run `npx --no-install campaigns-os tooling status --skills-revision 1.41.2+skills.1`
7
+ Bundle revision: 1.43.1+skills.1
8
+ Run `npx --no-install campaigns-os tooling status --skills-revision 1.43.1+skills.1`
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-qa
3
- version: 1.3.7
4
- description: Run spec-aware QA from a Campaign Map ID and tested campaign URL after build, polish, and deploy/local evidence exist, including Playwright typed-card test-order proof.
3
+ version: 1.3.11
4
+ description: Run spec-aware QA from a saved Map or local-spec Build Packet and tested campaign URL after build, polish, and deploy/local evidence exist, including Playwright typed-card test-order proof.
5
5
  ---
6
6
 
7
- Bundle revision: 1.41.2+skills.1
8
- Run `npx --no-install campaigns-os tooling status --skills-revision 1.41.2+skills.1`
7
+ Bundle revision: 1.43.1+skills.1
8
+ Run `npx --no-install campaigns-os tooling status --skills-revision 1.43.1+skills.1`
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
@@ -45,7 +45,7 @@ The effect class in each parenthetical below is the declared row of
45
45
  Read that file, not this text, when an exact path or endpoint matters.
46
46
 
47
47
 
48
- Use this after the campaign has a preview or production URL and the assembly report records build and polish status. The public v0 runner is Node/npm-based, with an owned Playwright browser pass. `qa resolve` is tier `A` (it fetches `--base-url`; `--no-probe` is tier `B` and local); every `qa run` form is tier `C` — it overwrites the stored verdict and the assembly report, places real typed-card test orders against the campaign, and posts the verdict and the progress observation; `qa parity` is tier `A` (it drives the fixture's scenario through the candidate funnel with real typed-card orders and publishes the verdict, but takes no packet, so it writes only under `qa-output/` — never the packet, the assembly report or the verdict sidecar; `--no-post-verdict` drops the publish and stays tier `A`):
48
+ Use this after the campaign has a tested localhost, preview or production URL and the assembly report records build and polish status. The public v0 runner is Node/npm-based, with an owned Playwright browser pass. `qa resolve` is tier `A` (it fetches `--base-url`; `--no-probe` is tier `B` and local); every `qa run` form is tier `C` — it overwrites the stored verdict and the assembly report, places requested typed-card test orders against the campaign, and can post saved-Map verdicts and progress under their existing controls. Local-spec packet verdicts and progress stay local; `qa parity` is tier `A` (it drives the fixture's scenario through the candidate funnel with real typed-card orders and publishes the verdict, but takes no packet, so it writes only under `qa-output/` — never the packet, the assembly report or the verdict sidecar; `--no-post-verdict` drops the publish and stays tier `A`):
49
49
 
50
50
  ```bash
51
51
  npx --no-install campaigns-os qa install-browser
@@ -53,9 +53,9 @@ npx --no-install campaigns-os qa resolve --packet campaign-runtime.build.json
53
53
  npx --no-install campaigns-os qa run --packet campaign-runtime.build.json --base-url <preview-url>
54
54
  # Fixture-driven migration parity proof. Publishes to the QA portal by default.
55
55
  npx --no-install campaigns-os qa parity --fixture <parity-fixture.json> --scenario <scenario-id> --base-url <preview-url>
56
- # Browser QA + typed-card proof. Publishes to the QA portal by default and prints the portal link.
56
+ # Browser QA + typed-card proof. Saved-Map publishing follows consent; local-spec QA stays local.
57
57
  npx --no-install campaigns-os qa run --packet campaign-runtime.build.json --base-url <preview-url> --browser --test-order common
58
- # Offline / dev / CI only: keep the verdict local
58
+ # Keep a saved-Map verdict local (local-spec verdicts are always local).
59
59
  npx --no-install campaigns-os qa run --packet campaign-runtime.build.json --base-url <preview-url> --browser --test-order common --no-post-verdict
60
60
  ```
61
61
 
@@ -66,7 +66,7 @@ already installed.
66
66
 
67
67
  Inputs:
68
68
 
69
- - Campaign Map ID from the Build Packet
69
+ - Build Packet with a saved Map ID or `local_spec_id`; local-spec QA requires `--packet`
70
70
  - tested base URL (localhost dev URL, preview URL, or production URL)
71
71
  - assembly report
72
72
  - Test-order coverage choice (`common` default vs explicit paths vs topology-complete `full`) and SDK origin state (localhost is a Development domain; non-localhost origins need allowlist confirmation so the SDK loads)
@@ -89,7 +89,8 @@ Rules:
89
89
  - A missing or topology-unrecognized receipt is `MANUAL_REVIEW`/`WARN`; a recognized receipt with no dataLayer, outbound Meta, or outbound GA4 Purchase is `FAIL`/`BLOCKER`. Capture, unreadable-page, and settle-deadline errors on a recognized receipt are explicit non-waivable blockers. The `analytics-correctness:purchase-fires` waiver applies only to a genuine recognized-receipt/no-signal failure, and is recorded with `campaigns-os qa waive --assertion analytics-correctness:purchase-fires --reason "<why>"` (tier `C`: it overwrites the assembly report and doctor output; the lane is scoped to that one assertion and every other is refused).
90
90
  - Keep QA in a tight sequence: install the Playwright browser, resolve topology, run browser QA plus typed-card proof with `--test-order common` by default. Test orders need no permission step. Pause only for missing inputs, out-of-scope runtime pages that block checkout proof, or merchant-specific uncertainty.
91
91
  - Use `--browser` for rendered browser evidence. Browser QA must use the package-owned Playwright flow, not external agent/browser skills.
92
- - QA runs publish to the QA portal by default, so the QA tab/dashboard carries the full audit log and the run prints its portal link — report that link as the run reference. Pass `--no-post-verdict` (or `--local-only`) only for offline / dev / CI runs; `qa run --no-post-verdict` drops the verdict POST but stays tier `C` and still contacts `--base-url`, the run endpoint and the progress endpoint; those stay local-only under `qa-output/` and must not be reported as dashboard-visible.
92
+ - Saved-Map QA publishes to the QA portal under the existing consent and flag controls; report the portal link only when publication succeeds. Pass `--no-post-verdict` (or `--local-only`) to keep that verdict local. This stays tier `C`: served-page probes, requested orders, Run Telemetry and progress retain their own controls. See `docs/qa-and-test-orders.md` for the saved-Map publication policy.
93
+ - Local-spec QA always keeps verdicts and progress local. `qa run` suppresses portal publication even with `--post-verdict`; `qa publish` refuses local-spec packets with `local_spec`. Report the local verdict/sidecar as evidence, never a dashboard link. A matching route cannot replace a matching `local_spec_id`, and QA refuses a foreign or stale local Assembly Report. Run Telemetry still follows its consent controls.
93
94
  - Browser QA must include checkout commerce geometry evidence, not just mount counts: express-wallet buttons rendered in the current browser, card/CVV hosted iframe host dimensions, iframe text-path height, and center alignment. Apple Pay is browser/device eligible, so record mounted wallet kinds instead of requiring Apple Pay in Chrome-only QA.
94
95
  - `qa resolve` accepts either the deploy host or the campaign-root URL; when a Build Packet carries `campaign.public_route_slug`, the runner resolves page URLs under that slug.
95
96
  - Routing meta tags must be checked in runtime form. `next-success-url`, `next-upsell-accept-url`, and `next-upsell-decline-url` should point at campaign-root paths such as `/campaign-slug/upsell/`, not source filenames or unrooted spec literals.
package/skills.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "campaigns-os-skills",
3
3
  "description": "Skills bundled with Campaigns OS. `skills.sh` installs these into the shared agent skill directories (~/.claude/skills, ~/.codex/skills), so each one is a versioned package: bump the version whenever a package changes. `bundle_revision` identifies the bundle as a whole — `<package version>+skills.<n>`, where the prefix is this package's version and `<n>` counts the skill-text revisions published against it. It advances whenever ANY bundled skill changes, every SKILL.md states it on its first body line, and `campaigns-os tooling status --skills-revision <value>` compares the value an agent read from a skill against the bundle on disk. See docs/skills-revision.md.",
4
- "bundle_revision": "1.41.2+skills.1",
4
+ "bundle_revision": "1.43.1+skills.1",
5
5
  "homepage": "https://github.com/NextCommerceCo/campaigns-os",
6
6
  "retired_skills": [
7
7
  {
@@ -16,7 +16,7 @@
16
16
  {
17
17
  "id": "next-campaigns-os",
18
18
  "name": "Campaigns OS Lifecycle",
19
- "version": "1.0.23",
19
+ "version": "1.0.27",
20
20
  "path": "skills/next-campaigns-os/SKILL.md",
21
21
  "domain": "campaigns",
22
22
  "description": "Coordinate Campaigns OS lifecycle workflows from CampaignSpec, Build Packet, starter-template contracts, stage reports, deploy evidence, and QA proof depth."
@@ -24,7 +24,7 @@
24
24
  {
25
25
  "id": "next-campaigns-os-setup",
26
26
  "name": "Campaigns OS Setup",
27
- "version": "2.0.6",
27
+ "version": "2.0.10",
28
28
  "path": "skills/next-campaigns-os-setup/SKILL.md",
29
29
  "domain": "campaigns",
30
30
  "description": "Bootstrap or prepare a target page-kit campaign repo from a doctor-cleared Campaigns OS Build Packet before full build wiring. Formerly next-campaigns-setup; renamed to release that name to the published NextCommerceCo/skills scaffolder."
@@ -32,7 +32,7 @@
32
32
  {
33
33
  "id": "next-campaigns-build",
34
34
  "name": "Campaign Build",
35
- "version": "1.0.8",
35
+ "version": "1.0.12",
36
36
  "path": "skills/next-campaigns-build/SKILL.md",
37
37
  "domain": "campaigns",
38
38
  "description": "Assemble a NEXT campaign from a doctor-cleared Build Packet, CampaignSpec/API values, prepared HTML/assets, page-kit, and starter-template contracts."
@@ -40,7 +40,7 @@
40
40
  {
41
41
  "id": "next-campaigns-polish",
42
42
  "name": "Campaign Polish",
43
- "version": "1.1.7",
43
+ "version": "1.1.11",
44
44
  "path": "skills/next-campaigns-polish/SKILL.md",
45
45
  "domain": "campaigns",
46
46
  "description": "Run the visual/runtime polish pass after build and before QA for a Campaigns OS campaign."
@@ -48,15 +48,15 @@
48
48
  {
49
49
  "id": "next-campaigns-qa",
50
50
  "name": "Campaign QA",
51
- "version": "1.3.7",
51
+ "version": "1.3.11",
52
52
  "path": "skills/next-campaigns-qa/SKILL.md",
53
53
  "domain": "campaigns",
54
- "description": "Run spec-aware QA from a Campaign Map ID and tested campaign URL after build, polish, and deploy/local evidence exist, including Playwright typed-card test-order proof."
54
+ "description": "Run spec-aware QA from a saved Map or local-spec Build Packet and tested campaign URL after build, polish, and deploy/local evidence exist, including Playwright typed-card test-order proof."
55
55
  },
56
56
  {
57
57
  "id": "campaign-lifecycle-orientation",
58
58
  "name": "Campaign Lifecycle Orientation",
59
- "version": "1.0.3",
59
+ "version": "1.0.7",
60
60
  "path": "skills/campaign-lifecycle-orientation/SKILL.md",
61
61
  "domain": "campaigns",
62
62
  "description": "Orient a reader to the Campaigns OS lifecycle artifacts a run has already emitted, without advancing their state: the shared vocabulary, doctor as a gate, the stage record, and the store-theme/Page Kit two-worlds trap."
@@ -64,7 +64,7 @@
64
64
  {
65
65
  "id": "campaign-run-evidence",
66
66
  "name": "Campaign Run Evidence",
67
- "version": "1.0.3",
67
+ "version": "1.0.7",
68
68
  "path": "skills/campaign-run-evidence/SKILL.md",
69
69
  "domain": "campaigns",
70
70
  "description": "Interpret existing doctor, QA verdict and proof-depth evidence without claiming more proof than the artifacts contain, and keep funnel proof apart from merchant launch readiness."
@@ -72,7 +72,7 @@
72
72
  {
73
73
  "id": "campaign-readback-classification",
74
74
  "name": "Campaign Readback Classification",
75
- "version": "1.0.3",
75
+ "version": "1.0.7",
76
76
  "path": "skills/campaign-readback-classification/SKILL.md",
77
77
  "domain": "campaigns",
78
78
  "description": "Classify a selected campaign from the campaigns-os-readback/v2 fields (artifacts, staleness.stale_keys, clean, doctor, divergences, skip_cascades) and write a read-only handoff without turning diagnosis into permission."
@@ -80,7 +80,7 @@
80
80
  {
81
81
  "id": "contribution-intake",
82
82
  "name": "Contribution Intake",
83
- "version": "1.0.3",
83
+ "version": "1.0.7",
84
84
  "path": "skills/contribution-intake/SKILL.md",
85
85
  "domain": "campaigns",
86
86
  "description": "Turn a suggestion about the agent surface into a classified, evidence-checked and redacted proposal, filed on this repository tracker only with attended approval."