@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.
- package/AGENTS.md +114 -10
- package/CHANGELOG.md +708 -0
- package/README.md +44 -31
- package/agents/claude/CLAUDE.md +5 -1
- package/campaign-spec/dist/types.d.ts +2 -0
- package/contracts/agent-relevant-change-policy.v1.json +11 -1
- package/contracts/effects.v1.json +4887 -0
- package/contracts/migration-sidecar-bundle.v0.json +9 -0
- package/contracts/release-ledger.json +1541 -0
- package/contracts/supported-surface.json +33 -12
- package/docs/build-packet.md +83 -22
- package/docs/campaigns-os-build-flow.md +2 -2
- package/docs/demo-preview.md +1 -1
- package/docs/diagnostics.md +7 -4
- package/docs/effects.md +350 -0
- package/docs/gateway-login.md +113 -0
- package/docs/local-setup.md +51 -0
- package/docs/migration-sidecar-bundle.md +6 -1
- package/docs/orientation-contract-reference.md +4 -1
- package/docs/progress-snapshots.md +9 -3
- package/docs/qa-and-test-orders.md +29 -13
- package/docs/readback.md +523 -0
- package/docs/runtime-readiness.md +1 -1
- package/docs/sdk-storage-compatibility.md +1 -1
- package/docs/skills-revision.md +364 -0
- package/docs/supported-surface.md +11 -3
- package/docs/versioning.md +8 -4
- package/package.json +10 -4
- package/schemas/campaign-runtime-assembly-report.v0.schema.json +6 -1
- package/schemas/campaign-runtime-build-packet.v0.schema.json +11 -1
- package/schemas/campaign-spec.v4.schema.json +4 -0
- package/schemas/campaigns-os-effects.v1.schema.json +211 -0
- package/schemas/campaigns-os-progress-snapshot.v0.schema.json +1 -0
- package/schemas/campaigns-os-qa-verdict-sidecar.v0.schema.json +1 -0
- package/schemas/campaigns-os-qa-verdict.v0.schema.json +1 -0
- package/schemas/campaigns-os-readback.v2.schema.json +267 -0
- package/schemas/campaigns-os-run-record.v0.schema.json +1 -0
- package/skills/campaign-lifecycle-orientation/SKILL.md +179 -0
- package/skills/campaign-readback-classification/SKILL.md +230 -0
- package/skills/campaign-run-evidence/SKILL.md +142 -0
- package/skills/contribution-intake/SKILL.md +85 -0
- package/skills/next-campaigns-build/SKILL.md +33 -12
- package/skills/next-campaigns-os/SKILL.md +59 -22
- package/skills/next-campaigns-os/references/session-intake.md +4 -4
- package/skills/next-campaigns-os-setup/SKILL.md +35 -14
- package/skills/next-campaigns-polish/SKILL.md +43 -17
- package/skills/next-campaigns-qa/SKILL.md +53 -28
- package/skills.json +40 -7
- package/src/admin-transport.mjs +123 -0
- package/src/cli.mjs +1178 -270
- package/src/credential-store.mjs +183 -0
- package/src/deviation.mjs +3 -2
- package/src/diagnostic.mjs +4 -1
- package/src/finding-cause.mjs +14 -10
- package/src/gate-actions.mjs +2 -2
- package/src/install-mode.mjs +17 -9
- package/src/lifecycle.mjs +96 -0
- package/src/login.mjs +152 -0
- package/src/package-install-fixture.mjs +3 -2
- package/src/polish-node.mjs +5 -2
- package/src/progress-node.mjs +3 -2
- package/src/progress.mjs +5 -3
- package/src/qa-node.mjs +105 -36
- package/src/qa-publish.mjs +112 -2
- package/src/qa-sidecar.mjs +2 -0
- package/src/qa-verdict-discovery.mjs +11 -0
- package/src/qa-verdict-publish.mjs +1 -0
- package/src/qa-verdict.mjs +8 -1
- package/src/readback.mjs +1937 -0
- package/src/remit.mjs +17 -3
- package/src/run-record-closeout.mjs +3 -4
- package/src/run-record.mjs +4 -0
- package/src/sidecar-bundle.mjs +21 -0
- package/src/spec-source-identity.mjs +44 -0
- package/src/stage-ledger.mjs +4 -1
- 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.
|