@nextcommerce/campaigns-os 1.37.3 → 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 (76) hide show
  1. package/AGENTS.md +114 -10
  2. package/CHANGELOG.md +708 -0
  3. package/README.md +44 -31
  4. package/agents/claude/CLAUDE.md +5 -1
  5. package/campaign-spec/dist/types.d.ts +2 -0
  6. package/contracts/agent-relevant-change-policy.v1.json +11 -1
  7. package/contracts/effects.v1.json +4887 -0
  8. package/contracts/migration-sidecar-bundle.v0.json +9 -0
  9. package/contracts/release-ledger.json +1541 -0
  10. package/contracts/supported-surface.json +33 -12
  11. package/docs/build-packet.md +83 -22
  12. package/docs/campaigns-os-build-flow.md +2 -2
  13. package/docs/demo-preview.md +1 -1
  14. package/docs/diagnostics.md +7 -4
  15. package/docs/effects.md +350 -0
  16. package/docs/gateway-login.md +113 -0
  17. package/docs/local-setup.md +51 -0
  18. package/docs/migration-sidecar-bundle.md +6 -1
  19. package/docs/orientation-contract-reference.md +4 -1
  20. package/docs/progress-snapshots.md +9 -3
  21. package/docs/qa-and-test-orders.md +29 -13
  22. package/docs/readback.md +523 -0
  23. package/docs/runtime-readiness.md +1 -1
  24. package/docs/sdk-storage-compatibility.md +1 -1
  25. package/docs/skills-revision.md +364 -0
  26. package/docs/supported-surface.md +11 -3
  27. package/docs/versioning.md +8 -4
  28. package/package.json +10 -4
  29. package/schemas/campaign-runtime-assembly-report.v0.schema.json +6 -1
  30. package/schemas/campaign-runtime-build-packet.v0.schema.json +11 -1
  31. package/schemas/campaign-spec.v4.schema.json +4 -0
  32. package/schemas/campaigns-os-effects.v1.schema.json +211 -0
  33. package/schemas/campaigns-os-progress-snapshot.v0.schema.json +1 -0
  34. package/schemas/campaigns-os-qa-verdict-sidecar.v0.schema.json +1 -0
  35. package/schemas/campaigns-os-qa-verdict.v0.schema.json +1 -0
  36. package/schemas/campaigns-os-readback.v2.schema.json +267 -0
  37. package/schemas/campaigns-os-run-record.v0.schema.json +1 -0
  38. package/skills/campaign-lifecycle-orientation/SKILL.md +179 -0
  39. package/skills/campaign-readback-classification/SKILL.md +230 -0
  40. package/skills/campaign-run-evidence/SKILL.md +142 -0
  41. package/skills/contribution-intake/SKILL.md +85 -0
  42. package/skills/next-campaigns-build/SKILL.md +33 -12
  43. package/skills/next-campaigns-os/SKILL.md +59 -22
  44. package/skills/next-campaigns-os/references/session-intake.md +4 -4
  45. package/skills/next-campaigns-os-setup/SKILL.md +35 -14
  46. package/skills/next-campaigns-polish/SKILL.md +43 -17
  47. package/skills/next-campaigns-qa/SKILL.md +53 -28
  48. package/skills.json +40 -7
  49. package/src/admin-transport.mjs +123 -0
  50. package/src/cli.mjs +1178 -270
  51. package/src/credential-store.mjs +183 -0
  52. package/src/deviation.mjs +3 -2
  53. package/src/diagnostic.mjs +4 -1
  54. package/src/finding-cause.mjs +14 -10
  55. package/src/gate-actions.mjs +2 -2
  56. package/src/install-mode.mjs +17 -9
  57. package/src/lifecycle.mjs +96 -0
  58. package/src/login.mjs +152 -0
  59. package/src/package-install-fixture.mjs +3 -2
  60. package/src/polish-node.mjs +5 -2
  61. package/src/progress-node.mjs +3 -2
  62. package/src/progress.mjs +5 -3
  63. package/src/qa-node.mjs +105 -36
  64. package/src/qa-publish.mjs +112 -2
  65. package/src/qa-sidecar.mjs +2 -0
  66. package/src/qa-verdict-discovery.mjs +11 -0
  67. package/src/qa-verdict-publish.mjs +1 -0
  68. package/src/qa-verdict.mjs +8 -1
  69. package/src/readback.mjs +1937 -0
  70. package/src/remit.mjs +17 -3
  71. package/src/run-record-closeout.mjs +3 -4
  72. package/src/run-record.mjs +4 -0
  73. package/src/sidecar-bundle.mjs +21 -0
  74. package/src/spec-source-identity.mjs +44 -0
  75. package/src/stage-ledger.mjs +4 -1
  76. package/src/tooling-setup.mjs +160 -0
@@ -0,0 +1,179 @@
1
+ ---
2
+ name: campaign-lifecycle-orientation
3
+ version: 1.0.7
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
+ ---
6
+
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
+ from the campaign's Page Kit folder, where it runs the project's pinned copy and
10
+ never installs one, at the start of each task. Start a fresh session if it
11
+ reports `mismatch`: this text is already in your context and is never re-read
12
+ while the CLI on disk can move under it. If the output has no `Skills revision:`
13
+ line (no `revision_check` under `--json`), a campaigns-os older than this check
14
+ answered; follow none of its actions and run the pinned copy.
15
+
16
+ # Campaign lifecycle orientation
17
+
18
+ Use this skill to place Build Packet, Assembly Report and doctor language in the
19
+ pipeline and read what a run already recorded. It teaches interpretation only.
20
+ It advances no stage, and nothing in it is permission to run a command that
21
+ writes.
22
+
23
+ The effect class in each parenthetical below is the declared row of
24
+ `contracts/effects.v1.json` (`none` < `B` writes < `A` sends < `C`
25
+ destructive). Read that file, not this text, when an exact path or endpoint
26
+ matters.
27
+
28
+ ## Cite only the supported surface
29
+
30
+ For Campaigns OS facts, cite `contracts/supported-surface.json` and the entries
31
+ it names — `CONTEXT.md`, `CHANGELOG.md`, `skills.json`, the `contracts/`,
32
+ `schemas/` and `docs/` entries listed there, and the published CLI path. Never
33
+ cite `src/` or `scripts/`: those are implementation and may change without a
34
+ supported-surface bump, so a reader cannot check them and a rename would not
35
+ reach this text. `docs/supported-surface.md` is the prose twin of that list.
36
+
37
+ Identity comes from the tool, not from a file beside the session.
38
+ `campaigns-os tooling status --json` (tier `B`: its only write is the
39
+ command-lifecycle journal) reports the install mode, the version, and a source
40
+ commit when one is derivable. Quote what it printed. Do not derive the answer
41
+ from Git HEAD, from the word "latest", or from prose in a checkout.
42
+
43
+ ## Start with the shared vocabulary
44
+
45
+ `CONTEXT.md` is the glossary kept reconciled against the code, and it separates
46
+ public lifecycle language from internal implementation language. A
47
+ **CampaignSpec** is the JSON campaign contract; current packets use CampaignSpec
48
+ 4.2, whose funnel structure lives in `funnels[]`
49
+ (`schemas/campaign-spec.v4.schema.json`). A **Build Packet** is the assembly
50
+ handoff that wraps the spec without replacing it (`docs/build-packet.md`). An
51
+ **Assembly Report** is the machine-readable record of lifecycle progress.
52
+
53
+ A **Design Source Package** is the normalized source bundle Campaigns OS writes
54
+ when it prepares a build; a material source-reference refresh creates a new one
55
+ rather than editing one in place. A **Readiness Checkpoint** is an
56
+ artifact-backed gate, resumable across runs, passed on evidence or by a
57
+ recorded and attributed waiver. **Partial-source** scope is the documented case
58
+ where only part of a campaign's source is supplied: a declared input state, not
59
+ a degraded run, so treat the absent part as absent evidence rather than
60
+ inferring it.
61
+
62
+ ## Place the artifacts in the pipeline
63
+
64
+ Campaigns OS normalizes a CampaignSpec into `campaign-runtime.build.json`
65
+ (`campaign-runtime-build-packet/v0`). **Page Kit** is the static-site builder
66
+ for campaign funnels. Under the target repository's `.campaign-runtime/`
67
+ Campaigns OS also writes the Build Context, the Assembly Report, the doctor
68
+ output sidecar, theme evidence and normalized inputs
69
+ (`docs/campaigns-os-build-flow.md`). Its `_site/` output is deployed by a
70
+ separate system, and QA then tests a deployed URL
71
+ (`docs/qa-and-test-orders.md`).
72
+
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").
80
+
81
+ Campaign pages are typed. The page-type vocabulary is `presell`, `landing`,
82
+ `select`, `checkout`, `upsell`, `downsell` and `thankyou`; `select` is where a
83
+ shopper chooses a package before checkout. Use the spec's own term for a page
84
+ rather than describing it.
85
+
86
+ ## Read doctor as a gate
87
+
88
+ **Doctor** is the lifecycle gate that must pass before the stage ladder
89
+ proceeds. It checks the packet, its CampaignSpec, the artifacts and the built
90
+ output, and its ordered check registry records what ran. When blocking errors
91
+ exist the result is not OK, names the errors, and points the next step at
92
+ collecting or correcting input. `campaigns-os doctor --packet <packet> --json`
93
+ (tier `none`: inspection is the default, and without `--write` it leaves the
94
+ target byte-identical) is the inspection form.
95
+
96
+ Read doctor's recorded result, not a process exit code. Exit codes are knowable
97
+ only from implementation files this skill may not cite, so do not branch on one.
98
+
99
+ ## Read the stage record
100
+
101
+ `campaigns-os next --packet <packet> --json` (tier `A`: it captures a progress
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
105
+ incomplete stage among `setup`, `build`, `polish`, `deploy` and `qa`. That is a
106
+ writing, potentially sending command. If all you need is where the run stands,
107
+ prefer the readback below.
108
+
109
+ The stage called `build` at the CLI is stored under `stages.assembly`. The
110
+ Assembly Report's picker treats statuses beginning `completed` and statuses
111
+ beginning `skipped` as terminal. Build evidence carries `build_fingerprint`, an
112
+ identifier for the exact built state. Polish evidence must classify every
113
+ unresolved issue; the `repair_needed` class means the built output still needs
114
+ work, and the documented polish gate holds deploy and QA until the issue is
115
+ repaired, reclassified or covered by a structured waiver.
116
+
117
+ Where these artifacts already exist for a target, do not open them first.
118
+ `campaigns-os readback <target-repo-root> --json` (tier `none`: it writes
119
+ nothing, not even a lifecycle entry, starts no process and touches no network)
120
+ projects their loaded state, their per-artifact staleness against the
121
+ checkout's HEAD reflog, the doctor warning grouping, the skip cascades and any
122
+ cross-artifact divergence into one `campaigns-os-readback/v2` object.
123
+ `docs/readback.md` and `schemas/campaigns-os-readback.v2.schema.json` say what
124
+ each field means. Cite that projection as the evidence base and open the
125
+ artifacts themselves only to drill into what it names. This orientation
126
+ explains what the artifacts mean; it is not a licence to re-derive the
127
+ projection's staleness or warning grouping by hand.
128
+
129
+ The **Theme Gate** decides whether the generated brand layer is acceptable for
130
+ commerce pages. It is not advice: `next` and QA consume the result and stop
131
+ later stages when it is blocked. An applied layer or a recorded waiver with a
132
+ reason is the supported way through, and downstream evidence keeps the waiver
133
+ visible (`docs/brand-theme-bridge.md`).
134
+
135
+ ## Avoid the two-worlds mistake
136
+
137
+ Store themes and Page Kit campaign funnels are not one build surface, and
138
+ conflating them is the most expensive orientation error available here. This
139
+ repository documents Page Kit as the funnel target and describes the deployment
140
+ of its static output. It does not define the separate store-theme publishing
141
+ stack at all, so that half of the distinction is unverified from here — say so
142
+ rather than filling it in. A claim about store-theme publishing cannot be
143
+ sourced from this surface, and an answer that quietly treats a funnel artifact
144
+ as theme evidence (or the reverse) will read as authoritative while resting on
145
+ nothing.
146
+
147
+ For Page Kit routes, read the packet's per-page target projection — the
148
+ resolved output path for that page — rather than copying producer directories.
149
+ A page needs a **permalink**, an explicit public route assigned to it. Routing
150
+ surprises are not harmless: `prepare-build` can report
151
+ `PAGE_KIT_TARGET_CONFLICT` when two routes project to one terminal filename
152
+ (`docs/build-packet.md`). The machine-readable build summary is the evidence to
153
+ inspect; a build command that exited successfully does not establish correct
154
+ routing.
155
+
156
+ Two further routing error codes an earlier version of this text named were
157
+ dropped rather than re-sourced: they appear only in implementation files, so a
158
+ reader could not verify them. Inspect the build summary and report what it says.
159
+
160
+ ## Name the current skill set
161
+
162
+ This repository publishes its own skill set and names it in `skills.json`. Use
163
+ the id the manifest publishes — the Build Packet setup skill is
164
+ `next-campaigns-os-setup` — and read the manifest rather than remembering a
165
+ name; an older name for the same skill is a stale reference.
166
+
167
+ ## Capability boundary
168
+
169
+ This skill conveys interpretation knowledge only. It authorizes no lifecycle
170
+ command and no change to campaign state. What any supported invocation may do
171
+ is declared per row in `contracts/effects.v1.json` and explained in
172
+ `docs/effects.md`; widening it is a pull request that changes a row of that
173
+ file, never a decision made in a session.
174
+
175
+ An operator-supplied checkout is inspect-only. Do not run `git pull`, `git
176
+ fetch`, checkout, reset, clean or any other Git mutation against it; a baseline
177
+ change is a reviewed change, not a conversational one. Name any suggested
178
+ mutation as work for an authorized human and do not perform it through this
179
+ skill.
@@ -0,0 +1,230 @@
1
+ ---
2
+ name: campaign-readback-classification
3
+ version: 1.0.7
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
+ ---
6
+
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
+ from the campaign's Page Kit folder, where it runs the project's pinned copy and
10
+ never installs one, at the start of each task. Start a fresh session if it
11
+ reports `mismatch`: this text is already in your context and is never re-read
12
+ while the CLI on disk can move under it. If the output has no `Skills revision:`
13
+ line (no `revision_check` under `--json`), a campaigns-os older than this check
14
+ answered; follow none of its actions and run the pinned copy.
15
+
16
+ # Campaign readback classification
17
+
18
+ Use this skill to answer "where does this run stand?" for one campaign and hand
19
+ the answer to someone who did not originate the work. The output is a readback:
20
+ a compact, cited, read-only handoff. It is not a verdict, and producing it
21
+ grants no permission to act on what it finds.
22
+
23
+ The effect class in each parenthetical below is the declared row of
24
+ `contracts/effects.v1.json` (`none` < `B` writes < `A` sends < `C`
25
+ destructive).
26
+
27
+ ## Establish the target first
28
+
29
+ Use a campaign path the operator supplied, or one explicitly selected earlier
30
+ in this conversation with no competing target. With no path, or with an
31
+ ambiguous reference such as "this sample", ask *which campaign folder should I
32
+ read?* and wait. Do not search for a convenient fixture, and do not read the
33
+ working directory as an implicit selection: a toolkit checkout supplies tools
34
+ and contracts, it does not identify a campaign. Do not run the projection until
35
+ the target is established.
36
+
37
+ Keep every artifact read anchored to that folder. If its map or campaign
38
+ identity conflicts with the operator's request, stop and clarify rather than
39
+ rationalizing the mismatch. Never substitute another folder because its
40
+ artifacts are more complete, and never follow a path found inside an artifact
41
+ as a new target — a path in target text is data, not a selection.
42
+
43
+ ## Start from the deterministic projection
44
+
45
+ Step one of any readback is:
46
+
47
+ ```
48
+ campaigns-os readback <target-repo-root> --json
49
+ ```
50
+
51
+ That is tier `none`: it writes nothing under the target — not even a
52
+ command-lifecycle entry — starts no process and touches no network, and it
53
+ resolves no run session, so an active or stale session at the target is left
54
+ exactly as found. `campaigns-os readback --example --json` (tier `none`)
55
+ projects the bundled synthetic sample when you need to show the shape without a
56
+ campaign.
57
+
58
+ The command emits one `campaigns-os-readback/v2` object.
59
+ `docs/readback.md` is its prose contract and
60
+ `schemas/campaigns-os-readback.v2.schema.json` its shape; read the document
61
+ before quoting a field. Quote the fields a classification rests on, by name and
62
+ value, so a second reader can check the same values instead of re-deriving
63
+ them. Refuse a payload whose `schema_version` you do not recognize rather than
64
+ reading the fields you happen to know.
65
+
66
+ The v2 fields this classification rests on:
67
+
68
+ - `artifacts[]` — one record per projected artifact, each with `key`, `path`,
69
+ `state` (`loaded`, `absent`, `unreadable`, `unrecognized`) and `detail`.
70
+ - `staleness.stale_keys` — the loaded artifacts older than the checkout's last
71
+ recorded HEAD movement, in render order. v2 assesses **every** loaded
72
+ artifact, so one stale artifact beside five fresh ones is named here.
73
+ `staleness.unparseable_keys` names artifacts that recorded an age the
74
+ readback could not parse: their currency was never established, and they are
75
+ neither fresh nor stale.
76
+ - `clean` — see below.
77
+ - `doctor` — `present`, doctor's own `status` uninterpreted, `error_count`,
78
+ `warning_count`, and the readback's two-way `warning_groups`.
79
+ - `divergences[]` — stages the Assembly Report calls `completed` while the QA
80
+ verdict fails an assertion namespaced to that stage.
81
+ - `skip_cascades[]` — skipped QA assertions grouped by the failure that blocked
82
+ them.
83
+
84
+ Read raw artifacts only to drill into something the projection has already
85
+ named: the wording of a doctor warning, the body of a failing assertion, the
86
+ identity fields of a packet. Never re-compute staleness and never re-group
87
+ doctor warnings by hand. Both are the readback's own projection layer, and a
88
+ hand-derived second opinion over the same evidence is how two interpreters end
89
+ up disagreeing about one run.
90
+
91
+ An absent artifact is missing proof, not a prompt to invent a substitute. Do
92
+ not read markdown QA reports, equivalence ledgers or gate scripts as the
93
+ current verdict, doctor output or Assembly Report; treating them as current
94
+ state is how a superseded first-run blocker gets reported as the present. When
95
+ the `qa_verdict` row is `absent`, a QA-dependent decision classifies as
96
+ collect-inputs until a JSON verdict exists. Presentation-only deltas the named
97
+ JSON artifacts do not record — layout, copy, a narrowed savings panel — are out
98
+ of scope: note them as a hidden-context gap if an operator raised them, and do
99
+ not classify from them.
100
+
101
+ `clean` is a statement about the projection's own view, not a verdict on the
102
+ campaign. It is true only when every artifact found is loaded and recognized,
103
+ staleness is computable with nothing stale, `unparseable_keys` is empty,
104
+ `divergences` is empty, and `doctor.error_count` is zero. A run whose QA
105
+ verdict is `blocked` can be `clean: true`, correctly. So `clean` decides
106
+ whether the artifacts are trustworthy enough to read — never which
107
+ classification applies. When explaining `clean: false`, cite the failing field:
108
+ an `unreadable` or `unrecognized` artifact, uncomputable or stale freshness, a
109
+ `stale_keys` or `unparseable_keys` entry, a divergence, or a doctor error. An
110
+ absent QA verdict or findings export alone does not make `clean` false; do not
111
+ invent that explanation from missing files.
112
+
113
+ ## Keep the evidence axes separate
114
+
115
+ Classify each on its own, because a clean result on one proves nothing about
116
+ another:
117
+
118
+ - **Standardization** — does source structure and the artifact set fit the
119
+ portable contracts (`docs/campaign-standardization-report.md`)?
120
+ - **Operator readiness** — does an owner who did not originate the work have
121
+ enough context and proof to identify the next step?
122
+ - **Runtime readiness** — do routes, deployed output, Campaign Cart SDK startup
123
+ and the lifecycle gates have evidence?
124
+ - **Commerce proof** — does typed-card evidence and persisted order read-back
125
+ cover the requested decision (`docs/qa-and-test-orders.md`)?
126
+ - **Authority** — who may collect evidence, repair, deploy, or change merchant
127
+ state? This one is never inferred from a Campaigns OS artifact.
128
+
129
+ ## Choose one classification
130
+
131
+ Use exactly one, for the decision actually being asked:
132
+
133
+ - **ready** — the proof contract for that decision is complete. Name the
134
+ decisive artifacts and the next action an authorized owner may take, limited
135
+ to that decision.
136
+ - **collect-inputs** — no reproducible blocker is confirmed, but a required
137
+ input or proof is absent. Name its owner, one evidence-producing next action,
138
+ and the hold that remains meanwhile.
139
+ - **blocked** — a reproducible gate or failure prevents the decision. State
140
+ which check failed, the evidence that proves it, who owns the fix, and where
141
+ the repair is routed.
142
+ - **not-enough-evidence** — campaign identity or access is too weak to
143
+ distinguish a missing input from a blocker. Name the identity or access
144
+ evidence needed first.
145
+
146
+ This four-way call is an interpretation contract, not a Campaigns OS gate:
147
+ Campaigns OS supplies artifact states and named blockers, and no check in this
148
+ repository enforces the four rules.
149
+
150
+ ## Map upstream signals onto the four-way call
151
+
152
+ Translate an upstream name into one of the four; do not restate an upstream
153
+ label as if it were a classification, and do not invent a vocabulary
154
+ mid-readback.
155
+
156
+ | Upstream signal | Where it is recorded | Classification |
157
+ | --- | --- | --- |
158
+ | `standardization_blocker` severity | standardization report findings | blocked |
159
+ | an `artifacts[]` record whose `state` is `absent` | readback projection | collect-inputs |
160
+ | `runtime_proof_required` confidence, including a payment proof state | standardization report findings | collect-inputs |
161
+ | `operator_readiness` severity | standardization report findings | collect-inputs |
162
+ | identity that cannot be resolved to one campaign | readback projection and packet | not-enough-evidence |
163
+
164
+ The three collect-inputs rows share a cell because each names proof that is
165
+ absent rather than a gate that failed: `runtime_proof_required` is behaviour
166
+ only a browser test can confirm, `operator_readiness` is a repository that is
167
+ inspectable but lacks proof or business context, and an `absent` artifact is
168
+ one the run never emitted. Absent proof is not a defect and may not be reported
169
+ as blocked.
170
+
171
+ Unresolvable identity outranks every other row: if the projection cannot be
172
+ tied to one campaign, no label is attributable and the answer is
173
+ not-enough-evidence rather than a guess.
174
+
175
+ No upstream label maps to **ready**. Ready requires positive evidence that the
176
+ proof contract is complete — a statement about what the artifacts do record,
177
+ not about the absence of a blocker.
178
+
179
+ ## Triage warnings only on top of cited output
180
+
181
+ Ranking which projected warnings matter is permitted only over cited fields,
182
+ and the readback must say so. Cite the group and its count first, rank within
183
+ those cited values second, label the ranking as your judgment over that cited
184
+ output third. A triage that cannot point at the field it is ranking is not
185
+ triage; it is a competing second reading of the same evidence.
186
+
187
+ Never present a triage label as an upstream status. `contract-static` and
188
+ `repo-observed` are the readback's own grouping of doctor warnings, not
189
+ doctor's vocabulary, and doctor's `status` string belongs to doctor
190
+ uninterpreted. `contract-static` warnings restate a template family's shared
191
+ frontmatter contract and repeat verbatim on every pass while that contract is
192
+ in force: their persistence does not mean a value is unfixed, their
193
+ disappearance is not how a fix is confirmed, and a gate must not read them as
194
+ repository state. A `warning_count` of zero against an absent doctor output
195
+ records an absence, not an observation, and may not be triaged as a clean
196
+ result.
197
+
198
+ ## Write the readback
199
+
200
+ Lead with the selected folder and the available campaign/map identity, then the
201
+ stage, blockers, evidence and next action. Keep a simple status answer compact —
202
+ short paragraphs or a small table rather than a numbered section per field —
203
+ and expand when the operator asks for a full handoff.
204
+
205
+ Every readback still contains: campaign identity; the decision requested; the
206
+ classification; the known facts, each tied to its owning source; the missing or
207
+ conflicting evidence; the owner; the next action for that owner; the done
208
+ signal, meaning the artifact or observation that marks completion; the holds;
209
+ a form readable by a non-originating operator; and the hidden-context gap —
210
+ context the originating operator holds that the artifacts do not, which would
211
+ change this readback if it were available.
212
+
213
+ That list is a writing contract for whoever produces the readback. No check in
214
+ this repository enforces it. The result is a compact handoff that points at
215
+ owning artifacts, not a replacement verdict and not a lifecycle orchestrator.
216
+
217
+ ## Apply holds without inventing permission
218
+
219
+ Unless separate authority evidence says otherwise, keep holds on deploy, launch
220
+ and route changes; on offer, price and order mutation; on upgrade work whose QA
221
+ scope is unnamed; and on external readiness claims. Do not read a
222
+ standardization report as commercial-performance evidence: it is a read-only
223
+ source and runtime audit.
224
+
225
+ Diagnosis is not permission. Nothing in this skill authorizes a lifecycle
226
+ command or a change to campaign state, and a classification of **blocked** is
227
+ not a licence to repair it. What any supported invocation may do is declared
228
+ per row in `contracts/effects.v1.json` and explained in `docs/effects.md`;
229
+ widening it is a pull request that changes a row of that file, never a decision
230
+ made in a session. Assign every action to an authorized human.
@@ -0,0 +1,142 @@
1
+ ---
2
+ name: campaign-run-evidence
3
+ version: 1.0.7
4
+ description: Interpret existing Campaigns OS doctor, QA and proof-depth evidence without claiming more proof than the artifacts contain.
5
+ ---
6
+
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
+ from the campaign's Page Kit folder, where it runs the project's pinned copy and
10
+ never installs one, at the start of each task. Start a fresh session if it
11
+ reports `mismatch`: this text is already in your context and is never re-read
12
+ while the CLI on disk can move under it. If the output has no `Skills revision:`
13
+ line (no `revision_check` under `--json`), a campaigns-os older than this check
14
+ answered; follow none of its actions and run the pinned copy.
15
+
16
+ # Campaign run evidence
17
+
18
+ Use this skill when the question is "is this enough evidence?" — reading a
19
+ doctor result, a QA verdict, or the proof depth a run actually reached. It
20
+ interprets artifacts that already exist. It does not produce evidence, and
21
+ nothing in it authorizes a command that would.
22
+
23
+ The effect class in each parenthetical below is the declared row of
24
+ `contracts/effects.v1.json` (`none` < `B` writes < `A` sends < `C`
25
+ destructive).
26
+
27
+ ## Count artifacts, not impressions
28
+
29
+ A **proof contract** is the specific evidence a decision requires. A run passes
30
+ one only when Campaigns OS has written machine-readable evidence saying so: an
31
+ OK doctor result, and a QA verdict whose `disposition` is not `blocked`.
32
+ Visual confidence substitutes for neither. Doctor and QA remain the
33
+ authorities for those decisions (`docs/qa-and-test-orders.md`).
34
+
35
+ Read what is already recorded before producing anything.
36
+ `campaigns-os readback <target-repo-root> --json` (tier `none`: writes nothing,
37
+ starts no process, touches no network) projects the artifact set and its
38
+ freshness; `campaigns-os doctor --packet <packet> --json` (tier `none`:
39
+ inspection is the default and leaves the target byte-identical) re-reads a
40
+ packet without recording anything.
41
+
42
+ ## Read evidence depth in order
43
+
44
+ Evidence gets stronger as the runner moves from deployed HTTP and metadata
45
+ assertions, to rendered-browser structure checks, to the Campaign Cart SDK
46
+ debugger overlay, and finally to a payment order driven end to end by browser
47
+ automation. **Typed-card** means the runner enters a platform test card in the
48
+ hosted payment fields; read `docs/qa-and-test-orders.md` for the platform-owned
49
+ card data rather than copying card numbers into a handoff.
50
+
51
+ The `proof_policy` setting defines the required browser and typed-card depth.
52
+ It appears in the Build Packet as `qa.proof_policy` and on the Assembly Report
53
+ as `proof_policy`, and the `--test-order` mode selects the recorded order-path
54
+ sample. Report those choices; do not renegotiate them in conversation.
55
+
56
+ Depth is a property of the run that happened, not of the policy that was asked
57
+ for. A packet demanding typed-card depth whose verdict records no order proves
58
+ nothing about ordering — it records a policy and an unmet one.
59
+
60
+ ## Interpret the verdict exactly
61
+
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
67
+ that sidecar has been copied into the campaign repository. A markdown QA
68
+ report, a ledger or a gate script is not a verdict and must not be scanned for
69
+ a disposition, a run id or a blocker. Where two JSON verdicts exist, interpret
70
+ the one the projection loaded; do not walk a report looking for a later rerun.
71
+
72
+ `disposition` takes one of three values — `ready`, `ready_with_exceptions` or
73
+ `blocked` — derived from assertion status and severity: a failed blocker
74
+ produces `blocked`; warnings, manual review and warning-severity failures
75
+ produce `ready_with_exceptions`; otherwise it is `ready`.
76
+
77
+ Two statements an earlier version of this text carried were removed rather than
78
+ re-sourced, and the removal is the point: the derivation function's name and
79
+ the exit code `blocked` maps to are knowable only from implementation files
80
+ this skill may not cite. Read the disposition itself.
81
+
82
+ Silence is not success. A **template-family contract** declares the browser
83
+ structure expected from a family of campaign templates; where it declares no
84
+ machine-checkable structure, the corresponding assertion is `manual_review`,
85
+ not `pass`. `ready_with_exceptions` likewise identifies evidence that still
86
+ needs reading — it is not an approval label.
87
+
88
+ ## Separate commerce proof from weaker signals
89
+
90
+ For a committed cart and an accepted upsell, persisted order read-back is the
91
+ authoritative evidence. Client-side cart state is not a stable proof contract,
92
+ and rendered selection state proves selection rather than commitment. The
93
+ documented QA contract rejects reliance on the unstable `cartLines` field and
94
+ directs the harness to receipt line items or the documented event and DOM
95
+ signals. **Commercial-parity** QA is the documented check that a campaign's
96
+ commerce behaviour matches the platform's own, read from that contract rather
97
+ than inferred from a run.
98
+
99
+ An offline build cannot prove commerce behaviour. The Campaign Cart SDK, remote
100
+ assets, a deployed preview, the browser runtime and a typed-card order all
101
+ require outbound network access. Air-gapped evidence is limited to markup,
102
+ build and stylesheet validation and must not be reported as commerce QA.
103
+
104
+ A `ready` verdict proves the tested funnel contract, not the merchant's full
105
+ production readiness. Live payment methods, production URLs, supported markets,
106
+ legal and support details, analytics expectations and merchant configuration
107
+ belong to a separate launch-readiness question outside this skill's scope
108
+ (`docs/campaigns-os-build-flow.md`).
109
+
110
+ ## Read repair evidence conservatively
111
+
112
+ A blocked verdict should lead an authorized owner through a bounded repair
113
+ cycle: classify the evidence gap, make one scoped attempt, rerun the owning
114
+ check, compare the new artifact, and stop for handoff when another attempt
115
+ makes no progress. This skill observes the resulting artifacts; it neither runs
116
+ repairs nor teaches a repair command surface.
117
+
118
+ Be precise about what the toolkit enforces. It records repeated lifecycle
119
+ commands and carries blockers, warnings and evidence on stage artifacts
120
+ (`docs/workflow-findings-sidecar.md`,
121
+ `schemas/campaigns-os-run-record.v0.schema.json`). It defines no append-only
122
+ attempt ledger and no no-progress stopping rule, so state those two as human
123
+ handoff discipline rather than as a platform guarantee.
124
+
125
+ ## Handle a root 404 precisely
126
+
127
+ A campaign root can legitimately return HTTP 404 when the funnel begins on a
128
+ deeper route. Accept that only when entry-URL resolution names at least one
129
+ entry and the verdict shows a pass on the `http:<page_id>` check for one of
130
+ those entries. The resolver and the HTTP assertion decide this, not the root
131
+ response alone.
132
+
133
+ ## Capability boundary
134
+
135
+ This skill conveys interpretation knowledge only. It authorizes no lifecycle
136
+ command and no change to campaign state. In particular `campaigns-os qa run`
137
+ (tier `C`: it overwrites the stored verdict and can POST it off the machine)
138
+ and `campaigns-os checkpoint waive` (tier `C`: it records a waiver over a
139
+ blocking gate) are work for an authorized human, and urgency does not widen
140
+ that. What any supported invocation may do is declared per row in
141
+ `contracts/effects.v1.json` and explained in `docs/effects.md`; widening it is
142
+ a pull request that changes a row of that file, never a session decision.
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: contribution-intake
3
+ version: 1.0.7
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
+ ---
6
+
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
+ from the campaign's Page Kit folder, where it runs the project's pinned copy and
10
+ never installs one, at the start of each task. Start a fresh session if it
11
+ reports `mismatch`: this text is already in your context and is never re-read
12
+ while the CLI on disk can move under it. If the output has no `Skills revision:`
13
+ line (no `revision_check` under `--json`), a campaigns-os older than this check
14
+ answered; follow none of its actions and run the pinned copy.
15
+
16
+ # Contribution intake
17
+
18
+ When someone says the agent surface should change — a complaint, a wish, a "why
19
+ doesn't it" — fill in the template below instead of live-coding a response or
20
+ promising behaviour. Campaign work is not an intake trigger; it follows the
21
+ lifecycle skills.
22
+
23
+ Two classes end the filing path before the template is finished:
24
+
25
+ - **Lifecycle, stage readiness or verdict authority.** That belongs to
26
+ Campaigns OS itself. Say where it goes and why this intake cannot own it.
27
+ - **A capability change.** Anything that would broaden what an invocation
28
+ reads, writes, sends, or can do to merchant state is a change to a row of
29
+ `contracts/effects.v1.json`, and a row is not publishable without its effect
30
+ test (`docs/effects.md`). Say so plainly, record it as a capability change,
31
+ and stop. It lands as a reviewed pull request, never as a session decision
32
+ and never as an issue that implies one.
33
+
34
+ A suggestion that is really a one-off preference is situational judgment:
35
+ acknowledge it and file nothing.
36
+
37
+ ## The proposal template
38
+
39
+ 1. **Observation** — the task attempted, the behaviour observed, the behaviour
40
+ expected. Keep this separate from any proposed fix; record both, conflate
41
+ neither.
42
+ 2. **Version in hand** — what `campaigns-os tooling status --json` (tier `B`:
43
+ its only write is the command-lifecycle journal) reported, and the bundle
44
+ revision on the first body line of the skill you loaded.
45
+ 3. **Class** — exactly one: defect, missing explanation, workflow friction,
46
+ lifecycle (route away), capability change (stop), situational judgment.
47
+ 4. **Duplicate search** — what you searched and what you found, including a
48
+ null result.
49
+ 5. **Evidence** — the smallest reproduction there is, redacted per the
50
+ paragraph below. An absent reproduction is stated as absent, not implied.
51
+ 6. **Smallest test that would show it fixed.**
52
+ 7. **Non-goals** — what this proposal is explicitly not asking for.
53
+ 8. **Authority implications** — name them even when they are "none".
54
+
55
+ ## Redaction is the control
56
+
57
+ This is the one part of the template that is not negotiable, because the filing
58
+ is public and a filed issue cannot be unpublished. Before anything is rendered
59
+ for approval, scrub the whole proposal: no merchant or store names, no customer
60
+ or order data, no card numbers, no credentials or credential-shaped values, no
61
+ machine-local or home-directory paths, no internal tracker ids, no private
62
+ repository or endpoint names, no operator-local source identities. Replace each
63
+ with a synthetic stand-in and say that you did.
64
+
65
+ The bar is the same as for committed text in this repository, which is enforced
66
+ by `npm run check:private-strings`. If you cannot redact an example and keep it
67
+ meaningful, file the proposal without that example and name the gap.
68
+
69
+ ## Preview, then hand back the keyboard
70
+
71
+ Render the exact title and body, then ask for one of `discard`, `revise` or
72
+ `file`. Nothing is sent until they say `file`. A revision re-renders the
73
+ preview and resets approval. On `file`, use the harness's own connector for the
74
+ tracker, under the attended person's identity and permissions and never any
75
+ other credential: preview first, one operation, then read the result back and
76
+ compare it against the approved preview before reporting the URL. One approved
77
+ preview produces at most one issue; on an error, report it and ask before any
78
+ retry. If they cannot file on this repository, hand them the finished draft to
79
+ paste and record it as draft-only.
80
+
81
+ ## After filing, stop
82
+
83
+ The issue enters maintainer triage. Do not apply labels, do not start a branch,
84
+ do not sketch the fix, and do not treat the filed issue as permission to
85
+ implement it.