@nextcommerce/campaigns-os 1.37.3 → 1.41.2
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 +530 -0
- package/README.md +38 -27
- package/contracts/agent-relevant-change-policy.v1.json +11 -1
- package/contracts/effects.v1.json +4794 -0
- package/contracts/release-ledger.json +789 -0
- package/contracts/supported-surface.json +25 -5
- package/docs/build-packet.md +27 -16
- package/docs/demo-preview.md +1 -1
- package/docs/diagnostics.md +7 -4
- package/docs/effects.md +281 -0
- package/docs/gateway-login.md +113 -0
- package/docs/orientation-contract-reference.md +4 -1
- package/docs/progress-snapshots.md +3 -3
- package/docs/qa-and-test-orders.md +3 -3
- 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 +8 -3
- package/schemas/campaign-runtime-build-packet.v0.schema.json +5 -0
- package/schemas/campaigns-os-effects.v1.schema.json +211 -0
- package/schemas/campaigns-os-readback.v2.schema.json +267 -0
- package/skills/campaign-lifecycle-orientation/SKILL.md +174 -0
- package/skills/campaign-readback-classification/SKILL.md +230 -0
- package/skills/campaign-run-evidence/SKILL.md +140 -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 +45 -21
- 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 +48 -24
- package/skills.json +39 -6
- package/src/admin-transport.mjs +123 -0
- package/src/cli.mjs +991 -200
- package/src/credential-store.mjs +183 -0
- package/src/deviation.mjs +3 -2
- package/src/diagnostic.mjs +4 -1
- package/src/gate-actions.mjs +2 -2
- package/src/install-mode.mjs +17 -9
- package/src/lifecycle.mjs +95 -0
- package/src/login.mjs +152 -0
- package/src/package-install-fixture.mjs +3 -2
- package/src/qa-node.mjs +56 -19
- package/src/qa-publish.mjs +108 -2
- package/src/readback.mjs +1936 -0
- package/src/remit.mjs +17 -3
|
@@ -0,0 +1,4794 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "campaigns-os-effects/v1",
|
|
3
|
+
"_note": "The declared effect of every supported invocation: what it writes, what it sends, and the test case that proves it. One row per command, per subcommand and per effect-changing flag (vocabulary.effect_changing_flags). A row is not publishable without its effect test — scripts/check-effects.mjs refuses one, and refuses a flag from that list that a help usage line carries and no row declares. Read this with docs/effects.md.",
|
|
4
|
+
"contract_version": "1.1.0",
|
|
5
|
+
"vocabulary": {
|
|
6
|
+
"annotations": {
|
|
7
|
+
"readOnlyHint": "The invocation changes nothing: no file under the target, the working directory or the user's machine, and no request off the machine. The command-lifecycle journal counts — a journal append is a write like any other, so every readOnlyHint: true row is an invocation the CLI exempts from lifecycle capture (the converse does not hold: some journal-exempt invocations, such as demo and the --no-write forms, still write other declared files).",
|
|
8
|
+
"destructiveHint": "The invocation can overwrite, clear or discard state that existed before it ran (a waiver over a blocking gate, a cleared run session, an overwritten verdict or assembly report). Only meaningful when readOnlyHint is false.",
|
|
9
|
+
"openWorldHint": "The invocation can contact an endpoint off this machine. True exactly when the row declares at least one send.",
|
|
10
|
+
"idempotentHint": "Repeating the invocation with the same arguments adds no effect beyond the first run."
|
|
11
|
+
},
|
|
12
|
+
"tiers": {
|
|
13
|
+
"none": "No effect: nothing written anywhere, nothing sent.",
|
|
14
|
+
"B": "Writes: files are created or updated under the target, the working directory or the user's machine. Nothing leaves the machine.",
|
|
15
|
+
"A": "Sends: the invocation can contact an endpoint off this machine (it may write locally too).",
|
|
16
|
+
"C": "Destructive: the invocation overwrites, clears or discards state that was already there (it may send too).",
|
|
17
|
+
"_ranking": "A row carries the HIGHEST tier it can reach, ranked none < B < A < C."
|
|
18
|
+
},
|
|
19
|
+
"locations": {
|
|
20
|
+
"{target}": "The target the invocation names: the directory given to --target, or the Page Kit target repository the Build Packet points at.",
|
|
21
|
+
"{cwd}": "The working directory the invocation runs in.",
|
|
22
|
+
"{packet}": "The Build Packet the invocation names (--packet), wherever it lives — it need not be the copy inside the target repository.",
|
|
23
|
+
"{spec}": "The CampaignSpec file the Build Packet names (spec.local_path), which need not live inside the target repository.",
|
|
24
|
+
"{home}": "The user's machine: the home directory and the config root under it (XDG_CONFIG_HOME when set).",
|
|
25
|
+
"{lifecycle-journal}": "The command-lifecycle journal wherever it was selected for the invocation — the active run session's journal, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG.",
|
|
26
|
+
"{proxy-base}": "The endpoint --proxy-base names, or the canonical NEXT endpoint when it does not.",
|
|
27
|
+
"{base-url}": "The campaign under test, as --base-url names it or as the packet derives it.",
|
|
28
|
+
"{map-id}": "The saved Map the CampaignSpec identifies.",
|
|
29
|
+
"{playwright-download-host}": "Where Playwright fetches browser builds from: PLAYWRIGHT_DOWNLOAD_HOST when set, else the Playwright CDN (cdn.playwright.dev). The one destination in this file that is not a Campaigns OS endpoint — `qa install-browser` is the one supported invocation that downloads from a third party."
|
|
30
|
+
},
|
|
31
|
+
"conditions": {
|
|
32
|
+
"no_session": "No run session at the target or the working directory.",
|
|
33
|
+
"ambient_session": "An active ambient run session opened by `run start` at the target.",
|
|
34
|
+
"stale_session": "A run session at the target idle past the 12 h TTL, and one at the working directory too.",
|
|
35
|
+
"lifecycle_log": "CAMPAIGNS_OS_LIFECYCLE_LOG names a journal outside the runtime directory.",
|
|
36
|
+
"persisted_consent": "Run Telemetry consent PERSISTED on the machine for the loopback receiver's scope — the record `telemetry on --proxy-base <loopback>` writes — with no CAMPAIGNS_OS_TELEMETRY override, a synthetic campaign key in the environment, no run session, and the receiver named by --proxy-base wherever the command takes one. The condition exists because consent must not be read from the row under test: under the other four the fixture switches consent on only for rows that DECLARE a consent-gated send, so a send nobody declared ran with consent off and left no trace. Here every row runs consented, and any request the receiver sees that no declared send covers fails the row."
|
|
37
|
+
},
|
|
38
|
+
"test_scope": {
|
|
39
|
+
"full": "The invocation executes past its preflight in the offline fixture, so every declared write and send with a non-empty observed_in is observed by the test.",
|
|
40
|
+
"preflight": "The invocation cannot execute past its preflight offline (a browser, a live gateway, a real credential, a real store). The test proves the preflight refusal writes nothing beyond what the row declares, and — where a loopback receiver can stand in for the destination — that the declared destination IS the one contacted."
|
|
41
|
+
},
|
|
42
|
+
"observed_in": "The conditions in which the effect test must SEE this write or send. An empty list declares an effect the offline fixture cannot reach; it then requires a not_observed_reason, and check-effects refuses the row without one. The test always refuses an effect that is NOT declared, in every condition.",
|
|
43
|
+
"effect_changing_flags": [
|
|
44
|
+
"--browser",
|
|
45
|
+
"--built",
|
|
46
|
+
"--dry-run",
|
|
47
|
+
"--emit-packet",
|
|
48
|
+
"--example",
|
|
49
|
+
"--force",
|
|
50
|
+
"--from-store",
|
|
51
|
+
"--list",
|
|
52
|
+
"--no-post-verdict",
|
|
53
|
+
"--no-probe",
|
|
54
|
+
"--no-remit",
|
|
55
|
+
"--no-run-session",
|
|
56
|
+
"--no-write",
|
|
57
|
+
"--republish",
|
|
58
|
+
"--test-order",
|
|
59
|
+
"--write",
|
|
60
|
+
"--write-map"
|
|
61
|
+
],
|
|
62
|
+
"preflight": "What the preflight itself may do, on a `test_scope: \"preflight\"` row, declared apart from the effects the row declares for the invocation that gets past it: `may_write` is the complete list of paths the refusal may write (no `**` — an allowance that licenses a subtree licenses the home directory the refusal must not touch) and `may_contact` the exact request paths the loopback receiver may see. The test enforces both independently of `writes`/`sends`, so a write declared for the success path cannot license the preflight to write there."
|
|
63
|
+
},
|
|
64
|
+
"rows": [
|
|
65
|
+
{
|
|
66
|
+
"command": "help",
|
|
67
|
+
"subcommand": null,
|
|
68
|
+
"flags": [],
|
|
69
|
+
"annotations": {
|
|
70
|
+
"readOnlyHint": true,
|
|
71
|
+
"destructiveHint": false,
|
|
72
|
+
"openWorldHint": false,
|
|
73
|
+
"idempotentHint": true
|
|
74
|
+
},
|
|
75
|
+
"tier": "none",
|
|
76
|
+
"writes": [],
|
|
77
|
+
"sends": [],
|
|
78
|
+
"effect_test": "effects: help",
|
|
79
|
+
"test_scope": "full",
|
|
80
|
+
"notes": "Prints usage. The CLI skips lifecycle capture for `help`, so not even the journal is appended."
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"command": "readback",
|
|
84
|
+
"subcommand": null,
|
|
85
|
+
"flags": [],
|
|
86
|
+
"annotations": {
|
|
87
|
+
"readOnlyHint": true,
|
|
88
|
+
"destructiveHint": false,
|
|
89
|
+
"openWorldHint": false,
|
|
90
|
+
"idempotentHint": true
|
|
91
|
+
},
|
|
92
|
+
"tier": "none",
|
|
93
|
+
"writes": [],
|
|
94
|
+
"sends": [],
|
|
95
|
+
"effect_test": "effects: readback",
|
|
96
|
+
"test_scope": "full",
|
|
97
|
+
"notes": "A read-only projection of one run's artifacts. readback bypasses run-session resolution and the stale sweep, and persistLifecycleIfRequested writes no entry for it, so an active or stale session at the target is left exactly as found."
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"command": "readback",
|
|
101
|
+
"subcommand": null,
|
|
102
|
+
"flags": [
|
|
103
|
+
"--example"
|
|
104
|
+
],
|
|
105
|
+
"annotations": {
|
|
106
|
+
"readOnlyHint": true,
|
|
107
|
+
"destructiveHint": false,
|
|
108
|
+
"openWorldHint": false,
|
|
109
|
+
"idempotentHint": true
|
|
110
|
+
},
|
|
111
|
+
"tier": "none",
|
|
112
|
+
"writes": [],
|
|
113
|
+
"sends": [],
|
|
114
|
+
"effect_test": "effects: readback --example",
|
|
115
|
+
"test_scope": "full",
|
|
116
|
+
"notes": "Projects the bundled synthetic sample; reads nothing under the target."
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"command": "run",
|
|
120
|
+
"subcommand": "status",
|
|
121
|
+
"flags": [],
|
|
122
|
+
"annotations": {
|
|
123
|
+
"readOnlyHint": true,
|
|
124
|
+
"destructiveHint": false,
|
|
125
|
+
"openWorldHint": false,
|
|
126
|
+
"idempotentHint": true
|
|
127
|
+
},
|
|
128
|
+
"tier": "none",
|
|
129
|
+
"writes": [],
|
|
130
|
+
"sends": [],
|
|
131
|
+
"effect_test": "effects: run status",
|
|
132
|
+
"test_scope": "full",
|
|
133
|
+
"notes": "Read-only by contract: it never sweeps a stale session and never journals (persistLifecycleIfRequested returns early for `run status`)."
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"command": "doctor",
|
|
137
|
+
"subcommand": null,
|
|
138
|
+
"flags": [],
|
|
139
|
+
"annotations": {
|
|
140
|
+
"readOnlyHint": true,
|
|
141
|
+
"destructiveHint": false,
|
|
142
|
+
"openWorldHint": false,
|
|
143
|
+
"idempotentHint": true
|
|
144
|
+
},
|
|
145
|
+
"tier": "none",
|
|
146
|
+
"writes": [],
|
|
147
|
+
"sends": [],
|
|
148
|
+
"effect_test": "effects: doctor",
|
|
149
|
+
"test_scope": "full",
|
|
150
|
+
"notes": "Inspection is the default. With --packet and without --write, doctor writes no sidecar AND appends no lifecycle entry, so an inspection of a delivered campaign leaves the target byte-identical."
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"command": "doctor",
|
|
154
|
+
"subcommand": null,
|
|
155
|
+
"flags": [
|
|
156
|
+
"--no-write"
|
|
157
|
+
],
|
|
158
|
+
"annotations": {
|
|
159
|
+
"readOnlyHint": true,
|
|
160
|
+
"destructiveHint": false,
|
|
161
|
+
"openWorldHint": false,
|
|
162
|
+
"idempotentHint": true
|
|
163
|
+
},
|
|
164
|
+
"tier": "none",
|
|
165
|
+
"writes": [],
|
|
166
|
+
"sends": [],
|
|
167
|
+
"effect_test": "effects: doctor --no-write",
|
|
168
|
+
"test_scope": "full",
|
|
169
|
+
"notes": "--no-write wins over --write: no doctor sidecar, no assembly-report update, no journal entry."
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"command": "sdk",
|
|
173
|
+
"subcommand": "storage-check",
|
|
174
|
+
"flags": [],
|
|
175
|
+
"annotations": {
|
|
176
|
+
"readOnlyHint": true,
|
|
177
|
+
"destructiveHint": false,
|
|
178
|
+
"openWorldHint": false,
|
|
179
|
+
"idempotentHint": true
|
|
180
|
+
},
|
|
181
|
+
"tier": "none",
|
|
182
|
+
"writes": [],
|
|
183
|
+
"sends": [],
|
|
184
|
+
"effect_test": "effects: sdk storage-check",
|
|
185
|
+
"test_scope": "full",
|
|
186
|
+
"notes": "A static scan of tracked source in a Git checkout. Exempted from lifecycle capture by name in persistLifecycleIfRequested, and it bypasses the stale-session sweep."
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"command": "tooling",
|
|
190
|
+
"subcommand": "diagnose",
|
|
191
|
+
"flags": [],
|
|
192
|
+
"annotations": {
|
|
193
|
+
"readOnlyHint": true,
|
|
194
|
+
"destructiveHint": false,
|
|
195
|
+
"openWorldHint": false,
|
|
196
|
+
"idempotentHint": true
|
|
197
|
+
},
|
|
198
|
+
"tier": "none",
|
|
199
|
+
"writes": [],
|
|
200
|
+
"sends": [],
|
|
201
|
+
"effect_test": "effects: tooling diagnose",
|
|
202
|
+
"test_scope": "full",
|
|
203
|
+
"notes": "A redacted support summary. Dispatched before session resolution and lifecycle capture, so it cannot close out a stale session or journal."
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
"command": "*refused*",
|
|
207
|
+
"subcommand": null,
|
|
208
|
+
"flags": [],
|
|
209
|
+
"annotations": {
|
|
210
|
+
"readOnlyHint": true,
|
|
211
|
+
"destructiveHint": false,
|
|
212
|
+
"openWorldHint": false,
|
|
213
|
+
"idempotentHint": true
|
|
214
|
+
},
|
|
215
|
+
"tier": "none",
|
|
216
|
+
"writes": [],
|
|
217
|
+
"sends": [],
|
|
218
|
+
"effect_test": "effects: a refused invocation",
|
|
219
|
+
"test_scope": "full",
|
|
220
|
+
"notes": "An unknown command, an unknown subcommand refused before its handler runs, or a flag the command refuses up front. A refused invocation writes no file of its own and appends no lifecycle entry. The generated case runs the unknown-command shape; the companion case \"effects: the other two refused shapes write nothing either\" runs the other two under the same five conditions. The one exception is declared on the start/prepare-build/build/run start/run end rows: those close out a STALE session at the root they are about to act on BEFORE argv is refused."
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
"command": "page-kit",
|
|
224
|
+
"subcommand": "sync",
|
|
225
|
+
"flags": [
|
|
226
|
+
"--dry-run"
|
|
227
|
+
],
|
|
228
|
+
"annotations": {
|
|
229
|
+
"readOnlyHint": true,
|
|
230
|
+
"destructiveHint": false,
|
|
231
|
+
"openWorldHint": false,
|
|
232
|
+
"idempotentHint": true
|
|
233
|
+
},
|
|
234
|
+
"tier": "none",
|
|
235
|
+
"writes": [],
|
|
236
|
+
"sends": [],
|
|
237
|
+
"effect_test": "effects: page-kit sync --dry-run",
|
|
238
|
+
"test_scope": "full",
|
|
239
|
+
"notes": "page-kit sync --dry-run runs every check the real invocation runs and prints what it would do; it writes nothing under the target, appends no lifecycle entry (DRY_RUN_COMMANDS) and runs no stale-session closeout."
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
"command": "spec",
|
|
243
|
+
"subcommand": "derive",
|
|
244
|
+
"flags": [
|
|
245
|
+
"--dry-run"
|
|
246
|
+
],
|
|
247
|
+
"annotations": {
|
|
248
|
+
"readOnlyHint": true,
|
|
249
|
+
"destructiveHint": false,
|
|
250
|
+
"openWorldHint": false,
|
|
251
|
+
"idempotentHint": true
|
|
252
|
+
},
|
|
253
|
+
"tier": "none",
|
|
254
|
+
"writes": [],
|
|
255
|
+
"sends": [],
|
|
256
|
+
"effect_test": "effects: spec derive --dry-run",
|
|
257
|
+
"test_scope": "full",
|
|
258
|
+
"notes": "spec derive --dry-run runs every check the real invocation runs and prints what it would do; it writes nothing under the target, appends no lifecycle entry (DRY_RUN_COMMANDS) and runs no stale-session closeout."
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
"command": "install-skills",
|
|
262
|
+
"subcommand": null,
|
|
263
|
+
"flags": [
|
|
264
|
+
"--dry-run"
|
|
265
|
+
],
|
|
266
|
+
"annotations": {
|
|
267
|
+
"readOnlyHint": true,
|
|
268
|
+
"destructiveHint": false,
|
|
269
|
+
"openWorldHint": false,
|
|
270
|
+
"idempotentHint": true
|
|
271
|
+
},
|
|
272
|
+
"tier": "none",
|
|
273
|
+
"writes": [],
|
|
274
|
+
"sends": [],
|
|
275
|
+
"effect_test": "effects: install-skills --dry-run",
|
|
276
|
+
"test_scope": "full",
|
|
277
|
+
"notes": "install-skills --dry-run runs every check the real invocation runs and prints what it would do; it writes nothing under the target, appends no lifecycle entry (DRY_RUN_COMMANDS) and runs no stale-session closeout."
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
"command": "install-agent-context",
|
|
281
|
+
"subcommand": null,
|
|
282
|
+
"flags": [
|
|
283
|
+
"--dry-run"
|
|
284
|
+
],
|
|
285
|
+
"annotations": {
|
|
286
|
+
"readOnlyHint": true,
|
|
287
|
+
"destructiveHint": false,
|
|
288
|
+
"openWorldHint": false,
|
|
289
|
+
"idempotentHint": true
|
|
290
|
+
},
|
|
291
|
+
"tier": "none",
|
|
292
|
+
"writes": [],
|
|
293
|
+
"sends": [],
|
|
294
|
+
"effect_test": "effects: install-agent-context --dry-run",
|
|
295
|
+
"test_scope": "full",
|
|
296
|
+
"notes": "install-agent-context --dry-run runs every check the real invocation runs and prints what it would do; it writes nothing under the target, appends no lifecycle entry (DRY_RUN_COMMANDS) and runs no stale-session closeout."
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
"command": "qa",
|
|
300
|
+
"subcommand": "publish",
|
|
301
|
+
"flags": [
|
|
302
|
+
"--dry-run"
|
|
303
|
+
],
|
|
304
|
+
"annotations": {
|
|
305
|
+
"readOnlyHint": true,
|
|
306
|
+
"destructiveHint": false,
|
|
307
|
+
"openWorldHint": false,
|
|
308
|
+
"idempotentHint": true
|
|
309
|
+
},
|
|
310
|
+
"tier": "none",
|
|
311
|
+
"writes": [],
|
|
312
|
+
"sends": [],
|
|
313
|
+
"effect_test": "effects: qa publish --dry-run",
|
|
314
|
+
"test_scope": "full",
|
|
315
|
+
"notes": "qa publish --dry-run runs every check the real invocation runs and prints what it would do; it writes nothing under the target, appends no lifecycle entry (DRY_RUN_COMMANDS) and runs no stale-session closeout."
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
"command": "checkpoint",
|
|
319
|
+
"subcommand": "waive",
|
|
320
|
+
"flags": [
|
|
321
|
+
"--dry-run"
|
|
322
|
+
],
|
|
323
|
+
"annotations": {
|
|
324
|
+
"readOnlyHint": true,
|
|
325
|
+
"destructiveHint": false,
|
|
326
|
+
"openWorldHint": false,
|
|
327
|
+
"idempotentHint": true
|
|
328
|
+
},
|
|
329
|
+
"tier": "none",
|
|
330
|
+
"writes": [],
|
|
331
|
+
"sends": [],
|
|
332
|
+
"effect_test": "effects: checkpoint waive --dry-run",
|
|
333
|
+
"test_scope": "full",
|
|
334
|
+
"notes": "checkpoint waive --dry-run runs every check the real invocation runs and prints what it would do; it writes nothing under the target, appends no lifecycle entry (DRY_RUN_COMMANDS) and runs no stale-session closeout."
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
"command": "theme",
|
|
338
|
+
"subcommand": "waive",
|
|
339
|
+
"flags": [
|
|
340
|
+
"--dry-run"
|
|
341
|
+
],
|
|
342
|
+
"annotations": {
|
|
343
|
+
"readOnlyHint": true,
|
|
344
|
+
"destructiveHint": false,
|
|
345
|
+
"openWorldHint": false,
|
|
346
|
+
"idempotentHint": true
|
|
347
|
+
},
|
|
348
|
+
"tier": "none",
|
|
349
|
+
"writes": [],
|
|
350
|
+
"sends": [],
|
|
351
|
+
"effect_test": "effects: theme waive --dry-run",
|
|
352
|
+
"test_scope": "full",
|
|
353
|
+
"notes": "theme waive --dry-run runs every check the real invocation runs and prints what it would do; it writes nothing under the target, appends no lifecycle entry (DRY_RUN_COMMANDS) and runs no stale-session closeout."
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
"command": "run-record",
|
|
357
|
+
"subcommand": null,
|
|
358
|
+
"flags": [
|
|
359
|
+
"--dry-run"
|
|
360
|
+
],
|
|
361
|
+
"annotations": {
|
|
362
|
+
"readOnlyHint": true,
|
|
363
|
+
"destructiveHint": false,
|
|
364
|
+
"openWorldHint": false,
|
|
365
|
+
"idempotentHint": true
|
|
366
|
+
},
|
|
367
|
+
"tier": "none",
|
|
368
|
+
"writes": [],
|
|
369
|
+
"sends": [],
|
|
370
|
+
"effect_test": "effects: run-record --dry-run",
|
|
371
|
+
"test_scope": "full",
|
|
372
|
+
"notes": "run-record --dry-run runs every check the real invocation runs and prints what it would do; it writes nothing under the target, appends no lifecycle entry (DRY_RUN_COMMANDS) and runs no stale-session closeout."
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
"command": "run-record",
|
|
376
|
+
"subcommand": null,
|
|
377
|
+
"flags": [
|
|
378
|
+
"--no-write"
|
|
379
|
+
],
|
|
380
|
+
"annotations": {
|
|
381
|
+
"readOnlyHint": true,
|
|
382
|
+
"destructiveHint": false,
|
|
383
|
+
"openWorldHint": false,
|
|
384
|
+
"idempotentHint": true
|
|
385
|
+
},
|
|
386
|
+
"tier": "none",
|
|
387
|
+
"writes": [],
|
|
388
|
+
"sends": [],
|
|
389
|
+
"effect_test": "effects: run-record --no-write",
|
|
390
|
+
"test_scope": "full",
|
|
391
|
+
"notes": "--no-write skips the assembly's reads as well as the write, and suppresses the lifecycle append and the stale-session closeout, so the invocation leaves the target byte-identical."
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
"command": "next",
|
|
395
|
+
"subcommand": null,
|
|
396
|
+
"flags": [
|
|
397
|
+
"--no-write"
|
|
398
|
+
],
|
|
399
|
+
"annotations": {
|
|
400
|
+
"readOnlyHint": false,
|
|
401
|
+
"destructiveHint": false,
|
|
402
|
+
"openWorldHint": false,
|
|
403
|
+
"idempotentHint": true
|
|
404
|
+
},
|
|
405
|
+
"tier": "B",
|
|
406
|
+
"writes": [
|
|
407
|
+
{
|
|
408
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
409
|
+
"when": "an ambient run session is resolved for the invocation (its last-seen timestamp advances)",
|
|
410
|
+
"observed_in": [
|
|
411
|
+
"ambient_session"
|
|
412
|
+
]
|
|
413
|
+
}
|
|
414
|
+
],
|
|
415
|
+
"sends": [],
|
|
416
|
+
"effect_test": "effects: next --no-write",
|
|
417
|
+
"test_scope": "full",
|
|
418
|
+
"notes": "--no-write suppresses the progress snapshot, the doctor sidecar refresh and the lifecycle append, so under no session the invocation leaves the target byte-identical. It is NOT readOnlyHint: true, because resolving an ambient run session advances that session file — the one write --no-write does not suppress. Under the other three conditions nothing at all changes. No progress observation leaves the machine: the base `next` row declares that send, and this flag is what stops it (observed under persisted scoped consent, where the base form's POST is seen and this form's is not)."
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
"command": "bundle",
|
|
422
|
+
"subcommand": "check",
|
|
423
|
+
"flags": [],
|
|
424
|
+
"annotations": {
|
|
425
|
+
"readOnlyHint": false,
|
|
426
|
+
"destructiveHint": false,
|
|
427
|
+
"openWorldHint": false,
|
|
428
|
+
"idempotentHint": true
|
|
429
|
+
},
|
|
430
|
+
"tier": "B",
|
|
431
|
+
"writes": [
|
|
432
|
+
{
|
|
433
|
+
"path": "{lifecycle-journal}",
|
|
434
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
435
|
+
"observed_in": [
|
|
436
|
+
"ambient_session",
|
|
437
|
+
"lifecycle_log"
|
|
438
|
+
]
|
|
439
|
+
}
|
|
440
|
+
],
|
|
441
|
+
"sends": [],
|
|
442
|
+
"effect_test": "effects: bundle check",
|
|
443
|
+
"test_scope": "full",
|
|
444
|
+
"notes": "Validates the canonical bundle and writes no artifact of its own. Its only write is the command-lifecycle journal, which every command outside the read-only set appends when a journal is selected — so the row is tier B, not none."
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
"command": "standardize",
|
|
448
|
+
"subcommand": null,
|
|
449
|
+
"flags": [],
|
|
450
|
+
"annotations": {
|
|
451
|
+
"readOnlyHint": false,
|
|
452
|
+
"destructiveHint": false,
|
|
453
|
+
"openWorldHint": false,
|
|
454
|
+
"idempotentHint": true
|
|
455
|
+
},
|
|
456
|
+
"tier": "B",
|
|
457
|
+
"writes": [
|
|
458
|
+
{
|
|
459
|
+
"path": "{lifecycle-journal}",
|
|
460
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
461
|
+
"observed_in": [
|
|
462
|
+
"lifecycle_log"
|
|
463
|
+
]
|
|
464
|
+
}
|
|
465
|
+
],
|
|
466
|
+
"sends": [],
|
|
467
|
+
"effect_test": "effects: standardize",
|
|
468
|
+
"test_scope": "full",
|
|
469
|
+
"notes": "Produces a report on stdout and writes no file. Its only write is the command-lifecycle journal. `standardize --target <repo>` names no packet, so an ambient session bound to a packet elsewhere is not resolved for it and no entry is appended under that session."
|
|
470
|
+
},
|
|
471
|
+
{
|
|
472
|
+
"command": "theme",
|
|
473
|
+
"subcommand": "inspect",
|
|
474
|
+
"flags": [],
|
|
475
|
+
"annotations": {
|
|
476
|
+
"readOnlyHint": false,
|
|
477
|
+
"destructiveHint": false,
|
|
478
|
+
"openWorldHint": false,
|
|
479
|
+
"idempotentHint": true
|
|
480
|
+
},
|
|
481
|
+
"tier": "B",
|
|
482
|
+
"writes": [
|
|
483
|
+
{
|
|
484
|
+
"path": "{lifecycle-journal}",
|
|
485
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
486
|
+
"observed_in": [
|
|
487
|
+
"ambient_session",
|
|
488
|
+
"lifecycle_log"
|
|
489
|
+
]
|
|
490
|
+
}
|
|
491
|
+
],
|
|
492
|
+
"sends": [],
|
|
493
|
+
"effect_test": "effects: theme inspect",
|
|
494
|
+
"test_scope": "full",
|
|
495
|
+
"notes": "Inspects the brand theme and returns the decision; it writes no theme report (that is `theme generate`). Only the lifecycle journal is written."
|
|
496
|
+
},
|
|
497
|
+
{
|
|
498
|
+
"command": "validate-assembly-report",
|
|
499
|
+
"subcommand": null,
|
|
500
|
+
"flags": [],
|
|
501
|
+
"annotations": {
|
|
502
|
+
"readOnlyHint": false,
|
|
503
|
+
"destructiveHint": false,
|
|
504
|
+
"openWorldHint": false,
|
|
505
|
+
"idempotentHint": true
|
|
506
|
+
},
|
|
507
|
+
"tier": "B",
|
|
508
|
+
"writes": [
|
|
509
|
+
{
|
|
510
|
+
"path": "{lifecycle-journal}",
|
|
511
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
512
|
+
"observed_in": [
|
|
513
|
+
"lifecycle_log"
|
|
514
|
+
]
|
|
515
|
+
}
|
|
516
|
+
],
|
|
517
|
+
"sends": [],
|
|
518
|
+
"effect_test": "effects: validate-assembly-report",
|
|
519
|
+
"test_scope": "full",
|
|
520
|
+
"notes": "Schema-validates a report file in place and writes nothing back. Only the lifecycle journal is written."
|
|
521
|
+
},
|
|
522
|
+
{
|
|
523
|
+
"command": "tooling",
|
|
524
|
+
"subcommand": "status",
|
|
525
|
+
"flags": [],
|
|
526
|
+
"annotations": {
|
|
527
|
+
"readOnlyHint": false,
|
|
528
|
+
"destructiveHint": false,
|
|
529
|
+
"openWorldHint": false,
|
|
530
|
+
"idempotentHint": true
|
|
531
|
+
},
|
|
532
|
+
"tier": "B",
|
|
533
|
+
"writes": [
|
|
534
|
+
{
|
|
535
|
+
"path": "{lifecycle-journal}",
|
|
536
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
537
|
+
"observed_in": [
|
|
538
|
+
"lifecycle_log"
|
|
539
|
+
]
|
|
540
|
+
}
|
|
541
|
+
],
|
|
542
|
+
"sends": [],
|
|
543
|
+
"effect_test": "effects: tooling status",
|
|
544
|
+
"test_scope": "full",
|
|
545
|
+
"notes": "Reports install mode, git state, skill freshness and the local gateway login. It reads the credential store but never writes it. Only the lifecycle journal is written."
|
|
546
|
+
},
|
|
547
|
+
{
|
|
548
|
+
"command": "tooling",
|
|
549
|
+
"subcommand": "status",
|
|
550
|
+
"flags": [
|
|
551
|
+
"--force"
|
|
552
|
+
],
|
|
553
|
+
"annotations": {
|
|
554
|
+
"readOnlyHint": false,
|
|
555
|
+
"destructiveHint": false,
|
|
556
|
+
"openWorldHint": false,
|
|
557
|
+
"idempotentHint": true
|
|
558
|
+
},
|
|
559
|
+
"tier": "B",
|
|
560
|
+
"writes": [
|
|
561
|
+
{
|
|
562
|
+
"path": "{lifecycle-journal}",
|
|
563
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
564
|
+
"observed_in": [
|
|
565
|
+
"lifecycle_log"
|
|
566
|
+
]
|
|
567
|
+
}
|
|
568
|
+
],
|
|
569
|
+
"sends": [],
|
|
570
|
+
"effect_test": "effects: tooling status --force",
|
|
571
|
+
"test_scope": "full",
|
|
572
|
+
"notes": "--force overrides a stale_pin or conflicting_pin pin status and changes the exit status only: it writes nothing the plain row does not. The override is reported as pin.forced and recorded on the lifecycle journal entry through argv_shape."
|
|
573
|
+
},
|
|
574
|
+
{
|
|
575
|
+
"command": "findings",
|
|
576
|
+
"subcommand": "list",
|
|
577
|
+
"flags": [],
|
|
578
|
+
"annotations": {
|
|
579
|
+
"readOnlyHint": false,
|
|
580
|
+
"destructiveHint": false,
|
|
581
|
+
"openWorldHint": false,
|
|
582
|
+
"idempotentHint": true
|
|
583
|
+
},
|
|
584
|
+
"tier": "B",
|
|
585
|
+
"writes": [
|
|
586
|
+
{
|
|
587
|
+
"path": "{lifecycle-journal}",
|
|
588
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
589
|
+
"observed_in": [
|
|
590
|
+
"ambient_session",
|
|
591
|
+
"lifecycle_log"
|
|
592
|
+
]
|
|
593
|
+
}
|
|
594
|
+
],
|
|
595
|
+
"sends": [],
|
|
596
|
+
"effect_test": "effects: findings list",
|
|
597
|
+
"test_scope": "full",
|
|
598
|
+
"notes": "Reads the findings journal. Only the command-lifecycle journal is written."
|
|
599
|
+
},
|
|
600
|
+
{
|
|
601
|
+
"command": "findings",
|
|
602
|
+
"subcommand": "export",
|
|
603
|
+
"flags": [],
|
|
604
|
+
"annotations": {
|
|
605
|
+
"readOnlyHint": false,
|
|
606
|
+
"destructiveHint": false,
|
|
607
|
+
"openWorldHint": false,
|
|
608
|
+
"idempotentHint": true
|
|
609
|
+
},
|
|
610
|
+
"tier": "B",
|
|
611
|
+
"writes": [
|
|
612
|
+
{
|
|
613
|
+
"path": "{lifecycle-journal}",
|
|
614
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
615
|
+
"observed_in": [
|
|
616
|
+
"ambient_session",
|
|
617
|
+
"lifecycle_log"
|
|
618
|
+
]
|
|
619
|
+
}
|
|
620
|
+
],
|
|
621
|
+
"sends": [],
|
|
622
|
+
"effect_test": "effects: findings export",
|
|
623
|
+
"test_scope": "full",
|
|
624
|
+
"notes": "Projects the findings journal to stdout. Only the command-lifecycle journal is written."
|
|
625
|
+
},
|
|
626
|
+
{
|
|
627
|
+
"command": "run-record",
|
|
628
|
+
"subcommand": null,
|
|
629
|
+
"flags": [
|
|
630
|
+
"--list"
|
|
631
|
+
],
|
|
632
|
+
"annotations": {
|
|
633
|
+
"readOnlyHint": false,
|
|
634
|
+
"destructiveHint": false,
|
|
635
|
+
"openWorldHint": false,
|
|
636
|
+
"idempotentHint": true
|
|
637
|
+
},
|
|
638
|
+
"tier": "B",
|
|
639
|
+
"writes": [
|
|
640
|
+
{
|
|
641
|
+
"path": "{lifecycle-journal}",
|
|
642
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
643
|
+
"observed_in": [
|
|
644
|
+
"ambient_session",
|
|
645
|
+
"lifecycle_log"
|
|
646
|
+
]
|
|
647
|
+
}
|
|
648
|
+
],
|
|
649
|
+
"sends": [],
|
|
650
|
+
"effect_test": "effects: run-record --list",
|
|
651
|
+
"test_scope": "full",
|
|
652
|
+
"notes": "Prints the run ids on disk for this packet and, like --no-write, writes and sends nothing of its own — but unlike --no-write it is not exempt from lifecycle capture, so a selected journal is appended."
|
|
653
|
+
},
|
|
654
|
+
{
|
|
655
|
+
"command": "qa",
|
|
656
|
+
"subcommand": "policy set",
|
|
657
|
+
"flags": [],
|
|
658
|
+
"annotations": {
|
|
659
|
+
"readOnlyHint": false,
|
|
660
|
+
"destructiveHint": false,
|
|
661
|
+
"openWorldHint": false,
|
|
662
|
+
"idempotentHint": true
|
|
663
|
+
},
|
|
664
|
+
"tier": "B",
|
|
665
|
+
"writes": [
|
|
666
|
+
{
|
|
667
|
+
"path": "{packet}",
|
|
668
|
+
"when": "one of the named fields (--allowed-domains-confirmed, --deploy-target, --preview-url, --production-url, --order-path-depth) differs from the packet's current value",
|
|
669
|
+
"observed_in": [
|
|
670
|
+
"no_session",
|
|
671
|
+
"ambient_session",
|
|
672
|
+
"stale_session",
|
|
673
|
+
"lifecycle_log",
|
|
674
|
+
"persisted_consent"
|
|
675
|
+
]
|
|
676
|
+
},
|
|
677
|
+
{
|
|
678
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
679
|
+
"when": "the packet edit invalidates the retained doctor sidecar",
|
|
680
|
+
"observed_in": [
|
|
681
|
+
"no_session",
|
|
682
|
+
"ambient_session",
|
|
683
|
+
"stale_session",
|
|
684
|
+
"lifecycle_log",
|
|
685
|
+
"persisted_consent"
|
|
686
|
+
]
|
|
687
|
+
},
|
|
688
|
+
{
|
|
689
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
690
|
+
"when": "--order-path-depth is given and the report exists — the report's proof_policy mirror is refreshed through the ledger write",
|
|
691
|
+
"observed_in": [
|
|
692
|
+
"no_session",
|
|
693
|
+
"ambient_session",
|
|
694
|
+
"stale_session",
|
|
695
|
+
"lifecycle_log",
|
|
696
|
+
"persisted_consent"
|
|
697
|
+
]
|
|
698
|
+
},
|
|
699
|
+
{
|
|
700
|
+
"path": "{lifecycle-journal}",
|
|
701
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
702
|
+
"observed_in": [
|
|
703
|
+
"ambient_session",
|
|
704
|
+
"lifecycle_log"
|
|
705
|
+
]
|
|
706
|
+
}
|
|
707
|
+
],
|
|
708
|
+
"sends": [],
|
|
709
|
+
"effect_test": "effects: qa policy set",
|
|
710
|
+
"test_scope": "full",
|
|
711
|
+
"notes": "Writes the named fields into the BUILD PACKET (not the CampaignSpec): campaign.allowed_domains_confirmed, deploy.target/preview_url/production_url and qa.proof_policy.order_path_depth. A packet edit invalidates the retained doctor sidecar, which is stamped stale, and --order-path-depth also refreshes the assembly report's proof_policy mirror. An invocation whose values all match the packet already changes nothing but the lifecycle journal — which is what the row once declared, because the case passed values the fixture already held."
|
|
712
|
+
},
|
|
713
|
+
{
|
|
714
|
+
"command": "page-kit",
|
|
715
|
+
"subcommand": "parity",
|
|
716
|
+
"flags": [],
|
|
717
|
+
"annotations": {
|
|
718
|
+
"readOnlyHint": false,
|
|
719
|
+
"destructiveHint": false,
|
|
720
|
+
"openWorldHint": false,
|
|
721
|
+
"idempotentHint": true
|
|
722
|
+
},
|
|
723
|
+
"tier": "B",
|
|
724
|
+
"writes": [
|
|
725
|
+
{
|
|
726
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
727
|
+
"when": "the parity render completes — stages.assembly.evidence.local_proof.production_parity is recorded",
|
|
728
|
+
"observed_in": [],
|
|
729
|
+
"not_observed_reason": "the offline fixture is not a local-serve deploy target and has no page-kit renderer to build with, so the command refuses before the verdict is recorded"
|
|
730
|
+
},
|
|
731
|
+
{
|
|
732
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
733
|
+
"when": "the recorded parity verdict invalidates the retained doctor sidecar",
|
|
734
|
+
"observed_in": [],
|
|
735
|
+
"not_observed_reason": "the parity verdict the stamp follows is never recorded offline"
|
|
736
|
+
},
|
|
737
|
+
{
|
|
738
|
+
"path": "{lifecycle-journal}",
|
|
739
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
740
|
+
"observed_in": [
|
|
741
|
+
"ambient_session",
|
|
742
|
+
"lifecycle_log"
|
|
743
|
+
]
|
|
744
|
+
}
|
|
745
|
+
],
|
|
746
|
+
"sends": [],
|
|
747
|
+
"effect_test": "effects: page-kit parity (preflight)",
|
|
748
|
+
"test_scope": "preflight",
|
|
749
|
+
"notes": "PREFLIGHT-PROVED: production parity needs deploy.target local-serve and a page-kit renderer to build the development and production renders with; neither exists in the offline fixture, so the command refuses (exit 2) and writes nothing but the lifecycle entry. What it writes when it does run is declared here and was missing: the parity verdict lands on the assembly report (stages.assembly.evidence.local_proof.production_parity) and stamps the retained doctor sidecar stale. The renders themselves go to temporary directories outside the target.",
|
|
750
|
+
"preflight": {
|
|
751
|
+
"may_write": [
|
|
752
|
+
"{lifecycle-journal}"
|
|
753
|
+
],
|
|
754
|
+
"may_contact": []
|
|
755
|
+
}
|
|
756
|
+
},
|
|
757
|
+
{
|
|
758
|
+
"command": "doctor",
|
|
759
|
+
"subcommand": null,
|
|
760
|
+
"flags": [
|
|
761
|
+
"--built"
|
|
762
|
+
],
|
|
763
|
+
"annotations": {
|
|
764
|
+
"readOnlyHint": false,
|
|
765
|
+
"destructiveHint": false,
|
|
766
|
+
"openWorldHint": false,
|
|
767
|
+
"idempotentHint": true
|
|
768
|
+
},
|
|
769
|
+
"tier": "B",
|
|
770
|
+
"writes": [
|
|
771
|
+
{
|
|
772
|
+
"path": "{lifecycle-journal}",
|
|
773
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
774
|
+
"observed_in": [
|
|
775
|
+
"lifecycle_log"
|
|
776
|
+
]
|
|
777
|
+
}
|
|
778
|
+
],
|
|
779
|
+
"sends": [],
|
|
780
|
+
"effect_test": "effects: doctor --built",
|
|
781
|
+
"test_scope": "full",
|
|
782
|
+
"notes": "Doctors a built _site/ with no Build Packet. Without --emit-packet it writes no artifact; only the lifecycle journal is written. (The read-only journal exemption is scoped to the --packet inspection form, so --built journals.)"
|
|
783
|
+
},
|
|
784
|
+
{
|
|
785
|
+
"command": "doctor",
|
|
786
|
+
"subcommand": null,
|
|
787
|
+
"flags": [
|
|
788
|
+
"--built",
|
|
789
|
+
"--emit-packet"
|
|
790
|
+
],
|
|
791
|
+
"annotations": {
|
|
792
|
+
"readOnlyHint": false,
|
|
793
|
+
"destructiveHint": false,
|
|
794
|
+
"openWorldHint": false,
|
|
795
|
+
"idempotentHint": true
|
|
796
|
+
},
|
|
797
|
+
"tier": "B",
|
|
798
|
+
"writes": [
|
|
799
|
+
{
|
|
800
|
+
"path": "{target}/.campaign-runtime/minimal-build-packet.json",
|
|
801
|
+
"when": "always — the minimal Build Packet derived from the built site is emitted (--emit-packet <path> writes it where the path names instead)",
|
|
802
|
+
"observed_in": [
|
|
803
|
+
"no_session",
|
|
804
|
+
"ambient_session",
|
|
805
|
+
"stale_session",
|
|
806
|
+
"lifecycle_log",
|
|
807
|
+
"persisted_consent"
|
|
808
|
+
]
|
|
809
|
+
},
|
|
810
|
+
{
|
|
811
|
+
"path": "{lifecycle-journal}",
|
|
812
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
813
|
+
"observed_in": [
|
|
814
|
+
"lifecycle_log"
|
|
815
|
+
]
|
|
816
|
+
}
|
|
817
|
+
],
|
|
818
|
+
"sends": [],
|
|
819
|
+
"effect_test": "effects: doctor --built --emit-packet",
|
|
820
|
+
"test_scope": "full",
|
|
821
|
+
"notes": "--emit-packet turns the inspection into a writer: the minimal Build Packet derived from the built _site/ is written under the target's runtime directory (or to the path the flag names), so QA can run against the same campaign without a packet of its own."
|
|
822
|
+
},
|
|
823
|
+
{
|
|
824
|
+
"command": "telemetry",
|
|
825
|
+
"subcommand": "status",
|
|
826
|
+
"flags": [],
|
|
827
|
+
"annotations": {
|
|
828
|
+
"readOnlyHint": false,
|
|
829
|
+
"destructiveHint": false,
|
|
830
|
+
"openWorldHint": false,
|
|
831
|
+
"idempotentHint": true
|
|
832
|
+
},
|
|
833
|
+
"tier": "B",
|
|
834
|
+
"writes": [
|
|
835
|
+
{
|
|
836
|
+
"path": "{lifecycle-journal}",
|
|
837
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
838
|
+
"observed_in": [
|
|
839
|
+
"lifecycle_log"
|
|
840
|
+
]
|
|
841
|
+
}
|
|
842
|
+
],
|
|
843
|
+
"sends": [],
|
|
844
|
+
"effect_test": "effects: telemetry status",
|
|
845
|
+
"test_scope": "full",
|
|
846
|
+
"notes": "Reports the stored consent scope and checks it against an endpoint; it reads the machine config and never writes it. Only the lifecycle journal is written."
|
|
847
|
+
},
|
|
848
|
+
{
|
|
849
|
+
"command": "demo",
|
|
850
|
+
"subcommand": null,
|
|
851
|
+
"flags": [],
|
|
852
|
+
"annotations": {
|
|
853
|
+
"readOnlyHint": false,
|
|
854
|
+
"destructiveHint": false,
|
|
855
|
+
"openWorldHint": false,
|
|
856
|
+
"idempotentHint": false
|
|
857
|
+
},
|
|
858
|
+
"tier": "B",
|
|
859
|
+
"writes": [
|
|
860
|
+
{
|
|
861
|
+
"path": "{target}/**",
|
|
862
|
+
"when": "always — the offline sample is projected into the new --target directory",
|
|
863
|
+
"observed_in": [
|
|
864
|
+
"no_session",
|
|
865
|
+
"ambient_session",
|
|
866
|
+
"stale_session",
|
|
867
|
+
"lifecycle_log",
|
|
868
|
+
"persisted_consent"
|
|
869
|
+
]
|
|
870
|
+
}
|
|
871
|
+
],
|
|
872
|
+
"sends": [],
|
|
873
|
+
"effect_test": "effects: demo",
|
|
874
|
+
"test_scope": "full",
|
|
875
|
+
"notes": "An inert offline sample. It writes ONLY the new directory named by --target: no campaign evidence, no session recovery, no lifecycle entry (demo is dispatched before lifecycle capture). The card's §5.1 draft listed demo under inspection; the code writes a directory, so the row is tier B."
|
|
876
|
+
},
|
|
877
|
+
{
|
|
878
|
+
"command": "doctor",
|
|
879
|
+
"subcommand": null,
|
|
880
|
+
"flags": [
|
|
881
|
+
"--write"
|
|
882
|
+
],
|
|
883
|
+
"annotations": {
|
|
884
|
+
"readOnlyHint": false,
|
|
885
|
+
"destructiveHint": false,
|
|
886
|
+
"openWorldHint": false,
|
|
887
|
+
"idempotentHint": true
|
|
888
|
+
},
|
|
889
|
+
"tier": "B",
|
|
890
|
+
"writes": [
|
|
891
|
+
{
|
|
892
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
893
|
+
"when": "always under --write — the doctor sidecar is (re)written",
|
|
894
|
+
"observed_in": [
|
|
895
|
+
"no_session",
|
|
896
|
+
"ambient_session",
|
|
897
|
+
"stale_session",
|
|
898
|
+
"lifecycle_log",
|
|
899
|
+
"persisted_consent"
|
|
900
|
+
]
|
|
901
|
+
},
|
|
902
|
+
{
|
|
903
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
904
|
+
"when": "the run's doctor evidence on the assembly report changes",
|
|
905
|
+
"observed_in": [
|
|
906
|
+
"no_session",
|
|
907
|
+
"ambient_session",
|
|
908
|
+
"stale_session",
|
|
909
|
+
"lifecycle_log",
|
|
910
|
+
"persisted_consent"
|
|
911
|
+
]
|
|
912
|
+
},
|
|
913
|
+
{
|
|
914
|
+
"path": "{lifecycle-journal}",
|
|
915
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
916
|
+
"observed_in": [
|
|
917
|
+
"ambient_session",
|
|
918
|
+
"lifecycle_log"
|
|
919
|
+
]
|
|
920
|
+
}
|
|
921
|
+
],
|
|
922
|
+
"sends": [],
|
|
923
|
+
"effect_test": "effects: doctor --write",
|
|
924
|
+
"test_scope": "full",
|
|
925
|
+
"notes": "--write turns the inspection into a recording run: the doctor sidecar and the report's doctor evidence are rewritten, and the lifecycle exemption for the read-only form no longer applies."
|
|
926
|
+
},
|
|
927
|
+
{
|
|
928
|
+
"command": "theme",
|
|
929
|
+
"subcommand": "generate",
|
|
930
|
+
"flags": [],
|
|
931
|
+
"annotations": {
|
|
932
|
+
"readOnlyHint": false,
|
|
933
|
+
"destructiveHint": false,
|
|
934
|
+
"openWorldHint": false,
|
|
935
|
+
"idempotentHint": true
|
|
936
|
+
},
|
|
937
|
+
"tier": "B",
|
|
938
|
+
"writes": [
|
|
939
|
+
{
|
|
940
|
+
"path": "{target}/.campaign-runtime/theme/theme-report.json",
|
|
941
|
+
"when": "always — the generated brand theme report is written",
|
|
942
|
+
"observed_in": [
|
|
943
|
+
"no_session",
|
|
944
|
+
"ambient_session",
|
|
945
|
+
"stale_session",
|
|
946
|
+
"lifecycle_log",
|
|
947
|
+
"persisted_consent"
|
|
948
|
+
]
|
|
949
|
+
},
|
|
950
|
+
{
|
|
951
|
+
"path": "{target}/.campaign-runtime/theme/**",
|
|
952
|
+
"when": "the generated CSS and token files, when --out-dir is not redirected",
|
|
953
|
+
"observed_in": [],
|
|
954
|
+
"not_observed_reason": "the offline fixture's packet has no generatable brand source, so generation stops at the report"
|
|
955
|
+
},
|
|
956
|
+
{
|
|
957
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
958
|
+
"when": "the theme decision invalidates the retained doctor sidecar",
|
|
959
|
+
"observed_in": [
|
|
960
|
+
"no_session",
|
|
961
|
+
"ambient_session",
|
|
962
|
+
"stale_session",
|
|
963
|
+
"lifecycle_log",
|
|
964
|
+
"persisted_consent"
|
|
965
|
+
]
|
|
966
|
+
},
|
|
967
|
+
{
|
|
968
|
+
"path": "{lifecycle-journal}",
|
|
969
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
970
|
+
"observed_in": [
|
|
971
|
+
"ambient_session",
|
|
972
|
+
"lifecycle_log"
|
|
973
|
+
]
|
|
974
|
+
}
|
|
975
|
+
],
|
|
976
|
+
"sends": [],
|
|
977
|
+
"effect_test": "effects: theme generate",
|
|
978
|
+
"test_scope": "full",
|
|
979
|
+
"notes": "Generation is a write even when it produces no CSS: the theme report lands under the target and the retained doctor sidecar is stamped."
|
|
980
|
+
},
|
|
981
|
+
{
|
|
982
|
+
"command": "theme",
|
|
983
|
+
"subcommand": "generate",
|
|
984
|
+
"flags": [
|
|
985
|
+
"--force"
|
|
986
|
+
],
|
|
987
|
+
"annotations": {
|
|
988
|
+
"readOnlyHint": false,
|
|
989
|
+
"destructiveHint": true,
|
|
990
|
+
"openWorldHint": false,
|
|
991
|
+
"idempotentHint": true
|
|
992
|
+
},
|
|
993
|
+
"tier": "C",
|
|
994
|
+
"writes": [
|
|
995
|
+
{
|
|
996
|
+
"path": "{target}/.campaign-runtime/theme/theme-report.json",
|
|
997
|
+
"when": "always — the generated brand theme report is written",
|
|
998
|
+
"observed_in": [
|
|
999
|
+
"no_session",
|
|
1000
|
+
"ambient_session",
|
|
1001
|
+
"stale_session",
|
|
1002
|
+
"lifecycle_log",
|
|
1003
|
+
"persisted_consent"
|
|
1004
|
+
]
|
|
1005
|
+
},
|
|
1006
|
+
{
|
|
1007
|
+
"path": "{target}/.campaign-runtime/theme/**",
|
|
1008
|
+
"when": "the generated CSS and token files, when --out-dir is not redirected",
|
|
1009
|
+
"observed_in": [],
|
|
1010
|
+
"not_observed_reason": "the offline fixture's packet has no generatable brand source, so generation stops at the report"
|
|
1011
|
+
},
|
|
1012
|
+
{
|
|
1013
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
1014
|
+
"when": "the theme decision invalidates the retained doctor sidecar",
|
|
1015
|
+
"observed_in": [
|
|
1016
|
+
"no_session",
|
|
1017
|
+
"ambient_session",
|
|
1018
|
+
"stale_session",
|
|
1019
|
+
"lifecycle_log",
|
|
1020
|
+
"persisted_consent"
|
|
1021
|
+
]
|
|
1022
|
+
},
|
|
1023
|
+
{
|
|
1024
|
+
"path": "{lifecycle-journal}",
|
|
1025
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
1026
|
+
"observed_in": [
|
|
1027
|
+
"ambient_session",
|
|
1028
|
+
"lifecycle_log"
|
|
1029
|
+
]
|
|
1030
|
+
}
|
|
1031
|
+
],
|
|
1032
|
+
"sends": [],
|
|
1033
|
+
"effect_test": "effects: theme generate --force",
|
|
1034
|
+
"test_scope": "full",
|
|
1035
|
+
"notes": "DESTRUCTIVE: --force overwrites a generated brand theme that is already there, where the base form refuses to clobber it. The writes are the base form's."
|
|
1036
|
+
},
|
|
1037
|
+
{
|
|
1038
|
+
"command": "page-kit",
|
|
1039
|
+
"subcommand": "sync",
|
|
1040
|
+
"flags": [],
|
|
1041
|
+
"annotations": {
|
|
1042
|
+
"readOnlyHint": false,
|
|
1043
|
+
"destructiveHint": false,
|
|
1044
|
+
"openWorldHint": false,
|
|
1045
|
+
"idempotentHint": true
|
|
1046
|
+
},
|
|
1047
|
+
"tier": "B",
|
|
1048
|
+
"writes": [
|
|
1049
|
+
{
|
|
1050
|
+
"path": "{target}/_data/campaigns.json",
|
|
1051
|
+
"when": "one of the ten Store Profile / SDK-pin fields is usable and differs from the entry",
|
|
1052
|
+
"observed_in": [
|
|
1053
|
+
"no_session",
|
|
1054
|
+
"ambient_session",
|
|
1055
|
+
"stale_session",
|
|
1056
|
+
"lifecycle_log",
|
|
1057
|
+
"persisted_consent"
|
|
1058
|
+
]
|
|
1059
|
+
},
|
|
1060
|
+
{
|
|
1061
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
1062
|
+
"when": "the sync invalidates the retained doctor sidecar",
|
|
1063
|
+
"observed_in": [
|
|
1064
|
+
"no_session",
|
|
1065
|
+
"ambient_session",
|
|
1066
|
+
"stale_session",
|
|
1067
|
+
"lifecycle_log",
|
|
1068
|
+
"persisted_consent"
|
|
1069
|
+
]
|
|
1070
|
+
},
|
|
1071
|
+
{
|
|
1072
|
+
"path": "{lifecycle-journal}",
|
|
1073
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
1074
|
+
"observed_in": [
|
|
1075
|
+
"ambient_session",
|
|
1076
|
+
"lifecycle_log"
|
|
1077
|
+
]
|
|
1078
|
+
}
|
|
1079
|
+
],
|
|
1080
|
+
"sends": [],
|
|
1081
|
+
"effect_test": "effects: page-kit sync",
|
|
1082
|
+
"test_scope": "full",
|
|
1083
|
+
"notes": "Writes only those ten fields of the packet's route entry, only from usable spec values."
|
|
1084
|
+
},
|
|
1085
|
+
{
|
|
1086
|
+
"command": "spec",
|
|
1087
|
+
"subcommand": "derive",
|
|
1088
|
+
"flags": [],
|
|
1089
|
+
"annotations": {
|
|
1090
|
+
"readOnlyHint": false,
|
|
1091
|
+
"destructiveHint": false,
|
|
1092
|
+
"openWorldHint": false,
|
|
1093
|
+
"idempotentHint": true
|
|
1094
|
+
},
|
|
1095
|
+
"tier": "B",
|
|
1096
|
+
"writes": [
|
|
1097
|
+
{
|
|
1098
|
+
"path": "{spec}",
|
|
1099
|
+
"when": "the target repo states a field the spec does not (SDK pin, page_url, analytics ids)",
|
|
1100
|
+
"observed_in": [
|
|
1101
|
+
"no_session",
|
|
1102
|
+
"ambient_session",
|
|
1103
|
+
"stale_session",
|
|
1104
|
+
"lifecycle_log",
|
|
1105
|
+
"persisted_consent"
|
|
1106
|
+
]
|
|
1107
|
+
},
|
|
1108
|
+
{
|
|
1109
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
1110
|
+
"when": "the derive invalidates the retained doctor sidecar",
|
|
1111
|
+
"observed_in": [
|
|
1112
|
+
"no_session",
|
|
1113
|
+
"ambient_session",
|
|
1114
|
+
"stale_session",
|
|
1115
|
+
"lifecycle_log",
|
|
1116
|
+
"persisted_consent"
|
|
1117
|
+
]
|
|
1118
|
+
},
|
|
1119
|
+
{
|
|
1120
|
+
"path": "{lifecycle-journal}",
|
|
1121
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
1122
|
+
"observed_in": [
|
|
1123
|
+
"ambient_session",
|
|
1124
|
+
"lifecycle_log"
|
|
1125
|
+
]
|
|
1126
|
+
}
|
|
1127
|
+
],
|
|
1128
|
+
"sends": [],
|
|
1129
|
+
"effect_test": "effects: spec derive",
|
|
1130
|
+
"test_scope": "full",
|
|
1131
|
+
"notes": "Repo-derived fields only and no network by default. The write lands on the packet's local CampaignSpec (spec.local_path), which is outside the target repo in the shipped example layout — hence the {spec} location token."
|
|
1132
|
+
},
|
|
1133
|
+
{
|
|
1134
|
+
"command": "findings",
|
|
1135
|
+
"subcommand": "add",
|
|
1136
|
+
"flags": [],
|
|
1137
|
+
"annotations": {
|
|
1138
|
+
"readOnlyHint": false,
|
|
1139
|
+
"destructiveHint": false,
|
|
1140
|
+
"openWorldHint": false,
|
|
1141
|
+
"idempotentHint": false
|
|
1142
|
+
},
|
|
1143
|
+
"tier": "B",
|
|
1144
|
+
"writes": [
|
|
1145
|
+
{
|
|
1146
|
+
"path": "{cwd}/.campaign-runtime/workflow-findings.jsonl",
|
|
1147
|
+
"when": "always — the finding is appended to the journal",
|
|
1148
|
+
"observed_in": [
|
|
1149
|
+
"no_session",
|
|
1150
|
+
"ambient_session",
|
|
1151
|
+
"stale_session",
|
|
1152
|
+
"lifecycle_log",
|
|
1153
|
+
"persisted_consent"
|
|
1154
|
+
]
|
|
1155
|
+
},
|
|
1156
|
+
{
|
|
1157
|
+
"path": "{lifecycle-journal}",
|
|
1158
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
1159
|
+
"observed_in": [
|
|
1160
|
+
"ambient_session",
|
|
1161
|
+
"lifecycle_log"
|
|
1162
|
+
]
|
|
1163
|
+
}
|
|
1164
|
+
],
|
|
1165
|
+
"sends": [],
|
|
1166
|
+
"effect_test": "effects: findings add",
|
|
1167
|
+
"test_scope": "full",
|
|
1168
|
+
"notes": "Appends one Workflow Finding. Not idempotent: a second identical invocation appends a second entry."
|
|
1169
|
+
},
|
|
1170
|
+
{
|
|
1171
|
+
"command": "findings",
|
|
1172
|
+
"subcommand": "harvest",
|
|
1173
|
+
"flags": [],
|
|
1174
|
+
"annotations": {
|
|
1175
|
+
"readOnlyHint": false,
|
|
1176
|
+
"destructiveHint": false,
|
|
1177
|
+
"openWorldHint": false,
|
|
1178
|
+
"idempotentHint": true
|
|
1179
|
+
},
|
|
1180
|
+
"tier": "B",
|
|
1181
|
+
"writes": [
|
|
1182
|
+
{
|
|
1183
|
+
"path": "{lifecycle-journal}",
|
|
1184
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
1185
|
+
"observed_in": [
|
|
1186
|
+
"ambient_session",
|
|
1187
|
+
"lifecycle_log"
|
|
1188
|
+
]
|
|
1189
|
+
}
|
|
1190
|
+
],
|
|
1191
|
+
"sends": [],
|
|
1192
|
+
"effect_test": "effects: findings harvest",
|
|
1193
|
+
"test_scope": "full",
|
|
1194
|
+
"notes": "Derives findings from the packet, context and report and PRINTS them. Without --write it appends nothing but the lifecycle entry; --write has its own row."
|
|
1195
|
+
},
|
|
1196
|
+
{
|
|
1197
|
+
"command": "findings",
|
|
1198
|
+
"subcommand": "harvest",
|
|
1199
|
+
"flags": [
|
|
1200
|
+
"--write"
|
|
1201
|
+
],
|
|
1202
|
+
"annotations": {
|
|
1203
|
+
"readOnlyHint": false,
|
|
1204
|
+
"destructiveHint": false,
|
|
1205
|
+
"openWorldHint": false,
|
|
1206
|
+
"idempotentHint": true
|
|
1207
|
+
},
|
|
1208
|
+
"tier": "B",
|
|
1209
|
+
"writes": [
|
|
1210
|
+
{
|
|
1211
|
+
"path": "{cwd}/.campaign-runtime/workflow-findings.jsonl",
|
|
1212
|
+
"when": "--write is given and the harvest derives findings the journal does not already carry",
|
|
1213
|
+
"observed_in": [
|
|
1214
|
+
"no_session",
|
|
1215
|
+
"ambient_session",
|
|
1216
|
+
"stale_session",
|
|
1217
|
+
"lifecycle_log",
|
|
1218
|
+
"persisted_consent"
|
|
1219
|
+
]
|
|
1220
|
+
},
|
|
1221
|
+
{
|
|
1222
|
+
"path": "{lifecycle-journal}",
|
|
1223
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
1224
|
+
"observed_in": [
|
|
1225
|
+
"ambient_session",
|
|
1226
|
+
"lifecycle_log"
|
|
1227
|
+
]
|
|
1228
|
+
}
|
|
1229
|
+
],
|
|
1230
|
+
"sends": [],
|
|
1231
|
+
"effect_test": "effects: findings harvest --write",
|
|
1232
|
+
"test_scope": "full",
|
|
1233
|
+
"notes": "--write is what makes the harvest a writer: the derived findings the journal does not already hold are appended to the workflow findings sidecar beside the working directory."
|
|
1234
|
+
},
|
|
1235
|
+
{
|
|
1236
|
+
"command": "qa",
|
|
1237
|
+
"subcommand": "promote",
|
|
1238
|
+
"flags": [],
|
|
1239
|
+
"annotations": {
|
|
1240
|
+
"readOnlyHint": false,
|
|
1241
|
+
"destructiveHint": true,
|
|
1242
|
+
"openWorldHint": false,
|
|
1243
|
+
"idempotentHint": true
|
|
1244
|
+
},
|
|
1245
|
+
"tier": "C",
|
|
1246
|
+
"writes": [
|
|
1247
|
+
{
|
|
1248
|
+
"path": "{cwd}/.campaign-runtime/qa-verdict.json",
|
|
1249
|
+
"when": "always — the named verdict is projected over the committed sidecar",
|
|
1250
|
+
"observed_in": [
|
|
1251
|
+
"no_session",
|
|
1252
|
+
"ambient_session",
|
|
1253
|
+
"stale_session",
|
|
1254
|
+
"lifecycle_log",
|
|
1255
|
+
"persisted_consent"
|
|
1256
|
+
]
|
|
1257
|
+
},
|
|
1258
|
+
{
|
|
1259
|
+
"path": "{lifecycle-journal}",
|
|
1260
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
1261
|
+
"observed_in": [
|
|
1262
|
+
"ambient_session",
|
|
1263
|
+
"lifecycle_log"
|
|
1264
|
+
]
|
|
1265
|
+
}
|
|
1266
|
+
],
|
|
1267
|
+
"sends": [],
|
|
1268
|
+
"effect_test": "effects: qa promote",
|
|
1269
|
+
"test_scope": "full",
|
|
1270
|
+
"notes": "Projects one explicit qa-output verdict over the committed sidecar; the sidecar that was there is replaced, which is why destructiveHint is true."
|
|
1271
|
+
},
|
|
1272
|
+
{
|
|
1273
|
+
"command": "install-agent-context",
|
|
1274
|
+
"subcommand": null,
|
|
1275
|
+
"flags": [],
|
|
1276
|
+
"annotations": {
|
|
1277
|
+
"readOnlyHint": false,
|
|
1278
|
+
"destructiveHint": false,
|
|
1279
|
+
"openWorldHint": false,
|
|
1280
|
+
"idempotentHint": true
|
|
1281
|
+
},
|
|
1282
|
+
"tier": "B",
|
|
1283
|
+
"writes": [
|
|
1284
|
+
{
|
|
1285
|
+
"path": "{target}/.campaign-runtime/agent-context/*",
|
|
1286
|
+
"when": "always — the four agent context files are written into the target",
|
|
1287
|
+
"observed_in": [
|
|
1288
|
+
"no_session",
|
|
1289
|
+
"ambient_session",
|
|
1290
|
+
"stale_session",
|
|
1291
|
+
"lifecycle_log",
|
|
1292
|
+
"persisted_consent"
|
|
1293
|
+
]
|
|
1294
|
+
},
|
|
1295
|
+
{
|
|
1296
|
+
"path": "{target}/.gitignore",
|
|
1297
|
+
"when": "the target does not already ignore the runtime directory",
|
|
1298
|
+
"observed_in": [
|
|
1299
|
+
"no_session",
|
|
1300
|
+
"stale_session",
|
|
1301
|
+
"lifecycle_log",
|
|
1302
|
+
"persisted_consent"
|
|
1303
|
+
]
|
|
1304
|
+
},
|
|
1305
|
+
{
|
|
1306
|
+
"path": "{lifecycle-journal}",
|
|
1307
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
1308
|
+
"observed_in": [
|
|
1309
|
+
"lifecycle_log"
|
|
1310
|
+
]
|
|
1311
|
+
}
|
|
1312
|
+
],
|
|
1313
|
+
"sends": [],
|
|
1314
|
+
"effect_test": "effects: install-agent-context",
|
|
1315
|
+
"test_scope": "full",
|
|
1316
|
+
"notes": "Writes the agent context files into the target's runtime directory. The .gitignore line is added only when it is not already there — under the ambient condition `run start` has already added it."
|
|
1317
|
+
},
|
|
1318
|
+
{
|
|
1319
|
+
"command": "install-skills",
|
|
1320
|
+
"subcommand": null,
|
|
1321
|
+
"flags": [],
|
|
1322
|
+
"annotations": {
|
|
1323
|
+
"readOnlyHint": false,
|
|
1324
|
+
"destructiveHint": false,
|
|
1325
|
+
"openWorldHint": false,
|
|
1326
|
+
"idempotentHint": true
|
|
1327
|
+
},
|
|
1328
|
+
"tier": "B",
|
|
1329
|
+
"writes": [
|
|
1330
|
+
{
|
|
1331
|
+
"path": "{home}/.claude/skills/**",
|
|
1332
|
+
"when": "--platform claude (or all): the skill bundle is copied into the user's skills directory",
|
|
1333
|
+
"observed_in": [
|
|
1334
|
+
"no_session",
|
|
1335
|
+
"ambient_session",
|
|
1336
|
+
"stale_session",
|
|
1337
|
+
"lifecycle_log",
|
|
1338
|
+
"persisted_consent"
|
|
1339
|
+
]
|
|
1340
|
+
},
|
|
1341
|
+
{
|
|
1342
|
+
"path": "{home}/.codex/skills/**",
|
|
1343
|
+
"when": "--platform codex or all",
|
|
1344
|
+
"observed_in": [],
|
|
1345
|
+
"not_observed_reason": "the effect test installs the claude platform only, so the codex and agents destinations are declared but not exercised"
|
|
1346
|
+
},
|
|
1347
|
+
{
|
|
1348
|
+
"path": "{home}/.agents/skills/**",
|
|
1349
|
+
"when": "--platform agents or all",
|
|
1350
|
+
"observed_in": [],
|
|
1351
|
+
"not_observed_reason": "the effect test installs the claude platform only, so the codex and agents destinations are declared but not exercised"
|
|
1352
|
+
},
|
|
1353
|
+
{
|
|
1354
|
+
"path": "{lifecycle-journal}",
|
|
1355
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
1356
|
+
"observed_in": [
|
|
1357
|
+
"lifecycle_log"
|
|
1358
|
+
]
|
|
1359
|
+
}
|
|
1360
|
+
],
|
|
1361
|
+
"sends": [],
|
|
1362
|
+
"effect_test": "effects: install-skills",
|
|
1363
|
+
"test_scope": "full",
|
|
1364
|
+
"notes": "A MACHINE write, not a target write: the destination is the user's home directory, so the target repo is untouched. --target <skills-dir> redirects it."
|
|
1365
|
+
},
|
|
1366
|
+
{
|
|
1367
|
+
"command": "telemetry",
|
|
1368
|
+
"subcommand": "on",
|
|
1369
|
+
"flags": [],
|
|
1370
|
+
"annotations": {
|
|
1371
|
+
"readOnlyHint": false,
|
|
1372
|
+
"destructiveHint": false,
|
|
1373
|
+
"openWorldHint": false,
|
|
1374
|
+
"idempotentHint": true
|
|
1375
|
+
},
|
|
1376
|
+
"tier": "B",
|
|
1377
|
+
"writes": [
|
|
1378
|
+
{
|
|
1379
|
+
"path": "{home}/.config/campaigns-os/config.json",
|
|
1380
|
+
"when": "always — consent is recorded for ONE endpoint (the canonical NEXT endpoint, or the --proxy-base named)",
|
|
1381
|
+
"observed_in": [
|
|
1382
|
+
"no_session",
|
|
1383
|
+
"ambient_session",
|
|
1384
|
+
"stale_session",
|
|
1385
|
+
"lifecycle_log",
|
|
1386
|
+
"persisted_consent"
|
|
1387
|
+
]
|
|
1388
|
+
},
|
|
1389
|
+
{
|
|
1390
|
+
"path": "{lifecycle-journal}",
|
|
1391
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
1392
|
+
"observed_in": [
|
|
1393
|
+
"lifecycle_log"
|
|
1394
|
+
]
|
|
1395
|
+
}
|
|
1396
|
+
],
|
|
1397
|
+
"sends": [],
|
|
1398
|
+
"effect_test": "effects: telemetry on",
|
|
1399
|
+
"test_scope": "full",
|
|
1400
|
+
"notes": "Machine-level consent, honouring XDG_CONFIG_HOME. It records consent; it sends nothing itself."
|
|
1401
|
+
},
|
|
1402
|
+
{
|
|
1403
|
+
"command": "telemetry",
|
|
1404
|
+
"subcommand": "off",
|
|
1405
|
+
"flags": [],
|
|
1406
|
+
"annotations": {
|
|
1407
|
+
"readOnlyHint": false,
|
|
1408
|
+
"destructiveHint": false,
|
|
1409
|
+
"openWorldHint": false,
|
|
1410
|
+
"idempotentHint": true
|
|
1411
|
+
},
|
|
1412
|
+
"tier": "B",
|
|
1413
|
+
"writes": [
|
|
1414
|
+
{
|
|
1415
|
+
"path": "{home}/.config/campaigns-os/config.json",
|
|
1416
|
+
"when": "always — remit is turned off for every endpoint",
|
|
1417
|
+
"observed_in": [
|
|
1418
|
+
"no_session",
|
|
1419
|
+
"ambient_session",
|
|
1420
|
+
"stale_session",
|
|
1421
|
+
"lifecycle_log",
|
|
1422
|
+
"persisted_consent"
|
|
1423
|
+
]
|
|
1424
|
+
},
|
|
1425
|
+
{
|
|
1426
|
+
"path": "{lifecycle-journal}",
|
|
1427
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
1428
|
+
"observed_in": [
|
|
1429
|
+
"lifecycle_log"
|
|
1430
|
+
]
|
|
1431
|
+
}
|
|
1432
|
+
],
|
|
1433
|
+
"sends": [],
|
|
1434
|
+
"effect_test": "effects: telemetry off",
|
|
1435
|
+
"test_scope": "full",
|
|
1436
|
+
"notes": "Takes no --proxy-base: consent is withdrawn for every endpoint at once."
|
|
1437
|
+
},
|
|
1438
|
+
{
|
|
1439
|
+
"command": "logout",
|
|
1440
|
+
"subcommand": null,
|
|
1441
|
+
"flags": [],
|
|
1442
|
+
"annotations": {
|
|
1443
|
+
"readOnlyHint": false,
|
|
1444
|
+
"destructiveHint": false,
|
|
1445
|
+
"openWorldHint": false,
|
|
1446
|
+
"idempotentHint": true
|
|
1447
|
+
},
|
|
1448
|
+
"tier": "B",
|
|
1449
|
+
"writes": [
|
|
1450
|
+
{
|
|
1451
|
+
"path": "{home}/.campaigns-os/credentials/*",
|
|
1452
|
+
"when": "a stored gateway credential for the named store exists and is cleared",
|
|
1453
|
+
"observed_in": [],
|
|
1454
|
+
"not_observed_reason": "the offline fixture has no stored credential, so the clear is a no-op; the row is proved by the no-credential path writing nothing"
|
|
1455
|
+
}
|
|
1456
|
+
],
|
|
1457
|
+
"sends": [],
|
|
1458
|
+
"effect_test": "effects: logout (preflight)",
|
|
1459
|
+
"test_scope": "preflight",
|
|
1460
|
+
"notes": "PREFLIGHT-PROVED: clearing a credential needs one to have been minted by a gateway login, which is unreachable offline. The case proves the no-credential path writes NOTHING. Authentication never resolves or remits a run session and never records argv in a lifecycle journal — login and logout are dispatched ahead of both. Credentials live only in the user credential store (the macOS keychain, or a file under the user's home).",
|
|
1461
|
+
"preflight": {
|
|
1462
|
+
"may_write": [],
|
|
1463
|
+
"may_contact": []
|
|
1464
|
+
}
|
|
1465
|
+
},
|
|
1466
|
+
{
|
|
1467
|
+
"command": "next",
|
|
1468
|
+
"subcommand": null,
|
|
1469
|
+
"flags": [],
|
|
1470
|
+
"annotations": {
|
|
1471
|
+
"readOnlyHint": false,
|
|
1472
|
+
"destructiveHint": false,
|
|
1473
|
+
"openWorldHint": true,
|
|
1474
|
+
"idempotentHint": true
|
|
1475
|
+
},
|
|
1476
|
+
"tier": "A",
|
|
1477
|
+
"writes": [
|
|
1478
|
+
{
|
|
1479
|
+
"path": "{target}/.campaign-runtime/progress/**",
|
|
1480
|
+
"when": "always — the stage progress snapshot and its queued remit envelope are captured locally",
|
|
1481
|
+
"observed_in": [
|
|
1482
|
+
"no_session",
|
|
1483
|
+
"ambient_session",
|
|
1484
|
+
"stale_session",
|
|
1485
|
+
"lifecycle_log",
|
|
1486
|
+
"persisted_consent"
|
|
1487
|
+
]
|
|
1488
|
+
},
|
|
1489
|
+
{
|
|
1490
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
1491
|
+
"when": "the recomputed gates invalidate the retained doctor sidecar",
|
|
1492
|
+
"observed_in": [
|
|
1493
|
+
"no_session",
|
|
1494
|
+
"ambient_session",
|
|
1495
|
+
"stale_session",
|
|
1496
|
+
"lifecycle_log",
|
|
1497
|
+
"persisted_consent"
|
|
1498
|
+
]
|
|
1499
|
+
},
|
|
1500
|
+
{
|
|
1501
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
1502
|
+
"when": "an ambient run session is resolved for the invocation",
|
|
1503
|
+
"observed_in": [
|
|
1504
|
+
"ambient_session"
|
|
1505
|
+
]
|
|
1506
|
+
},
|
|
1507
|
+
{
|
|
1508
|
+
"path": "{lifecycle-journal}",
|
|
1509
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
1510
|
+
"observed_in": [
|
|
1511
|
+
"ambient_session",
|
|
1512
|
+
"lifecycle_log"
|
|
1513
|
+
]
|
|
1514
|
+
}
|
|
1515
|
+
],
|
|
1516
|
+
"sends": [
|
|
1517
|
+
{
|
|
1518
|
+
"destination": "{proxy-base}/api/progress",
|
|
1519
|
+
"what": "the stage progress observation — the snapshot just captured locally, POSTed under X-Campaign-Key",
|
|
1520
|
+
"when": "Run Telemetry consent is on for the endpoint, --no-remit and --no-write were not given, and the packet's campaign key resolves",
|
|
1521
|
+
"requires_consent": true,
|
|
1522
|
+
"observed_in": [
|
|
1523
|
+
"persisted_consent"
|
|
1524
|
+
]
|
|
1525
|
+
}
|
|
1526
|
+
],
|
|
1527
|
+
"effect_test": "effects: next",
|
|
1528
|
+
"test_scope": "full",
|
|
1529
|
+
"notes": "next self-decides the stage. The local capture always happens; the .remit.json envelope beside each snapshot records what the delivery did. It SENDS the progress observation: the snapshot captured under .campaign-runtime/progress/ is POSTed to {proxy-base}/api/progress when Run Telemetry consent resolves ON for that endpoint and the packet's campaign key resolves. Consent persisted for the endpoint (`telemetry on --proxy-base <url>`) is what reaches it; a CAMPAIGNS_OS_TELEMETRY=on override alone does not, because an env grant carries no scope and the remit refuses an unscoped grant for a non-canonical endpoint (scope_bypassed). That is why the four session conditions — which run with consent off for a row declaring no consent-gated send — saw no request, and why this row once declared none."
|
|
1530
|
+
},
|
|
1531
|
+
{
|
|
1532
|
+
"command": "next",
|
|
1533
|
+
"subcommand": "setup",
|
|
1534
|
+
"flags": [],
|
|
1535
|
+
"annotations": {
|
|
1536
|
+
"readOnlyHint": false,
|
|
1537
|
+
"destructiveHint": false,
|
|
1538
|
+
"openWorldHint": true,
|
|
1539
|
+
"idempotentHint": true
|
|
1540
|
+
},
|
|
1541
|
+
"tier": "A",
|
|
1542
|
+
"writes": [
|
|
1543
|
+
{
|
|
1544
|
+
"path": "{target}/.campaign-runtime/progress/**",
|
|
1545
|
+
"when": "always — the stage progress snapshot and its queued remit envelope are captured locally",
|
|
1546
|
+
"observed_in": [
|
|
1547
|
+
"no_session",
|
|
1548
|
+
"ambient_session",
|
|
1549
|
+
"stale_session",
|
|
1550
|
+
"lifecycle_log",
|
|
1551
|
+
"persisted_consent"
|
|
1552
|
+
]
|
|
1553
|
+
},
|
|
1554
|
+
{
|
|
1555
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
1556
|
+
"when": "the recomputed gates invalidate the retained doctor sidecar",
|
|
1557
|
+
"observed_in": [
|
|
1558
|
+
"no_session",
|
|
1559
|
+
"ambient_session",
|
|
1560
|
+
"stale_session",
|
|
1561
|
+
"lifecycle_log",
|
|
1562
|
+
"persisted_consent"
|
|
1563
|
+
]
|
|
1564
|
+
},
|
|
1565
|
+
{
|
|
1566
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
1567
|
+
"when": "an ambient run session is resolved for the invocation",
|
|
1568
|
+
"observed_in": [
|
|
1569
|
+
"ambient_session"
|
|
1570
|
+
]
|
|
1571
|
+
},
|
|
1572
|
+
{
|
|
1573
|
+
"path": "{lifecycle-journal}",
|
|
1574
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
1575
|
+
"observed_in": [
|
|
1576
|
+
"ambient_session",
|
|
1577
|
+
"lifecycle_log"
|
|
1578
|
+
]
|
|
1579
|
+
}
|
|
1580
|
+
],
|
|
1581
|
+
"sends": [
|
|
1582
|
+
{
|
|
1583
|
+
"destination": "{proxy-base}/api/progress",
|
|
1584
|
+
"what": "the stage progress observation — the snapshot just captured locally, POSTed under X-Campaign-Key",
|
|
1585
|
+
"when": "Run Telemetry consent is on for the endpoint, --no-remit and --no-write were not given, and the packet's campaign key resolves",
|
|
1586
|
+
"requires_consent": true,
|
|
1587
|
+
"observed_in": [
|
|
1588
|
+
"persisted_consent"
|
|
1589
|
+
]
|
|
1590
|
+
}
|
|
1591
|
+
],
|
|
1592
|
+
"effect_test": "effects: next setup",
|
|
1593
|
+
"test_scope": "full",
|
|
1594
|
+
"notes": "next setup recomputes that stage's gates and captures a progress snapshot. The local capture always happens; the .remit.json envelope beside each snapshot records what the delivery did. It SENDS the progress observation: the snapshot captured under .campaign-runtime/progress/ is POSTed to {proxy-base}/api/progress when Run Telemetry consent resolves ON for that endpoint and the packet's campaign key resolves. Consent persisted for the endpoint (`telemetry on --proxy-base <url>`) is what reaches it; a CAMPAIGNS_OS_TELEMETRY=on override alone does not, because an env grant carries no scope and the remit refuses an unscoped grant for a non-canonical endpoint (scope_bypassed). That is why the four session conditions — which run with consent off for a row declaring no consent-gated send — saw no request, and why this row once declared none."
|
|
1595
|
+
},
|
|
1596
|
+
{
|
|
1597
|
+
"command": "next",
|
|
1598
|
+
"subcommand": "build",
|
|
1599
|
+
"flags": [],
|
|
1600
|
+
"annotations": {
|
|
1601
|
+
"readOnlyHint": false,
|
|
1602
|
+
"destructiveHint": false,
|
|
1603
|
+
"openWorldHint": true,
|
|
1604
|
+
"idempotentHint": true
|
|
1605
|
+
},
|
|
1606
|
+
"tier": "A",
|
|
1607
|
+
"writes": [
|
|
1608
|
+
{
|
|
1609
|
+
"path": "{target}/.campaign-runtime/progress/**",
|
|
1610
|
+
"when": "always — the stage progress snapshot and its queued remit envelope are captured locally",
|
|
1611
|
+
"observed_in": [
|
|
1612
|
+
"no_session",
|
|
1613
|
+
"ambient_session",
|
|
1614
|
+
"stale_session",
|
|
1615
|
+
"lifecycle_log",
|
|
1616
|
+
"persisted_consent"
|
|
1617
|
+
]
|
|
1618
|
+
},
|
|
1619
|
+
{
|
|
1620
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
1621
|
+
"when": "the recomputed gates invalidate the retained doctor sidecar",
|
|
1622
|
+
"observed_in": [
|
|
1623
|
+
"no_session",
|
|
1624
|
+
"ambient_session",
|
|
1625
|
+
"stale_session",
|
|
1626
|
+
"lifecycle_log",
|
|
1627
|
+
"persisted_consent"
|
|
1628
|
+
]
|
|
1629
|
+
},
|
|
1630
|
+
{
|
|
1631
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
1632
|
+
"when": "an ambient run session is resolved for the invocation",
|
|
1633
|
+
"observed_in": [
|
|
1634
|
+
"ambient_session"
|
|
1635
|
+
]
|
|
1636
|
+
},
|
|
1637
|
+
{
|
|
1638
|
+
"path": "{lifecycle-journal}",
|
|
1639
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
1640
|
+
"observed_in": [
|
|
1641
|
+
"ambient_session",
|
|
1642
|
+
"lifecycle_log"
|
|
1643
|
+
]
|
|
1644
|
+
}
|
|
1645
|
+
],
|
|
1646
|
+
"sends": [
|
|
1647
|
+
{
|
|
1648
|
+
"destination": "{proxy-base}/api/progress",
|
|
1649
|
+
"what": "the stage progress observation — the snapshot just captured locally, POSTed under X-Campaign-Key",
|
|
1650
|
+
"when": "Run Telemetry consent is on for the endpoint, --no-remit and --no-write were not given, and the packet's campaign key resolves",
|
|
1651
|
+
"requires_consent": true,
|
|
1652
|
+
"observed_in": [
|
|
1653
|
+
"persisted_consent"
|
|
1654
|
+
]
|
|
1655
|
+
}
|
|
1656
|
+
],
|
|
1657
|
+
"effect_test": "effects: next build",
|
|
1658
|
+
"test_scope": "full",
|
|
1659
|
+
"notes": "next build recomputes that stage's gates and captures a progress snapshot. The local capture always happens; the .remit.json envelope beside each snapshot records what the delivery did. It SENDS the progress observation: the snapshot captured under .campaign-runtime/progress/ is POSTed to {proxy-base}/api/progress when Run Telemetry consent resolves ON for that endpoint and the packet's campaign key resolves. Consent persisted for the endpoint (`telemetry on --proxy-base <url>`) is what reaches it; a CAMPAIGNS_OS_TELEMETRY=on override alone does not, because an env grant carries no scope and the remit refuses an unscoped grant for a non-canonical endpoint (scope_bypassed). That is why the four session conditions — which run with consent off for a row declaring no consent-gated send — saw no request, and why this row once declared none."
|
|
1660
|
+
},
|
|
1661
|
+
{
|
|
1662
|
+
"command": "next",
|
|
1663
|
+
"subcommand": "polish",
|
|
1664
|
+
"flags": [],
|
|
1665
|
+
"annotations": {
|
|
1666
|
+
"readOnlyHint": false,
|
|
1667
|
+
"destructiveHint": false,
|
|
1668
|
+
"openWorldHint": true,
|
|
1669
|
+
"idempotentHint": true
|
|
1670
|
+
},
|
|
1671
|
+
"tier": "A",
|
|
1672
|
+
"writes": [
|
|
1673
|
+
{
|
|
1674
|
+
"path": "{target}/.campaign-runtime/progress/**",
|
|
1675
|
+
"when": "always — the stage progress snapshot and its queued remit envelope are captured locally",
|
|
1676
|
+
"observed_in": [
|
|
1677
|
+
"no_session",
|
|
1678
|
+
"ambient_session",
|
|
1679
|
+
"stale_session",
|
|
1680
|
+
"lifecycle_log",
|
|
1681
|
+
"persisted_consent"
|
|
1682
|
+
]
|
|
1683
|
+
},
|
|
1684
|
+
{
|
|
1685
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
1686
|
+
"when": "the recomputed gates invalidate the retained doctor sidecar",
|
|
1687
|
+
"observed_in": [
|
|
1688
|
+
"no_session",
|
|
1689
|
+
"ambient_session",
|
|
1690
|
+
"stale_session",
|
|
1691
|
+
"lifecycle_log",
|
|
1692
|
+
"persisted_consent"
|
|
1693
|
+
]
|
|
1694
|
+
},
|
|
1695
|
+
{
|
|
1696
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
1697
|
+
"when": "an ambient run session is resolved for the invocation",
|
|
1698
|
+
"observed_in": [
|
|
1699
|
+
"ambient_session"
|
|
1700
|
+
]
|
|
1701
|
+
},
|
|
1702
|
+
{
|
|
1703
|
+
"path": "{lifecycle-journal}",
|
|
1704
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
1705
|
+
"observed_in": [
|
|
1706
|
+
"ambient_session",
|
|
1707
|
+
"lifecycle_log"
|
|
1708
|
+
]
|
|
1709
|
+
}
|
|
1710
|
+
],
|
|
1711
|
+
"sends": [
|
|
1712
|
+
{
|
|
1713
|
+
"destination": "{proxy-base}/api/progress",
|
|
1714
|
+
"what": "the stage progress observation — the snapshot just captured locally, POSTed under X-Campaign-Key",
|
|
1715
|
+
"when": "Run Telemetry consent is on for the endpoint, --no-remit and --no-write were not given, and the packet's campaign key resolves",
|
|
1716
|
+
"requires_consent": true,
|
|
1717
|
+
"observed_in": [
|
|
1718
|
+
"persisted_consent"
|
|
1719
|
+
]
|
|
1720
|
+
}
|
|
1721
|
+
],
|
|
1722
|
+
"effect_test": "effects: next polish",
|
|
1723
|
+
"test_scope": "full",
|
|
1724
|
+
"notes": "next polish recomputes that stage's gates and captures a progress snapshot. The local capture always happens; the .remit.json envelope beside each snapshot records what the delivery did. It SENDS the progress observation: the snapshot captured under .campaign-runtime/progress/ is POSTed to {proxy-base}/api/progress when Run Telemetry consent resolves ON for that endpoint and the packet's campaign key resolves. Consent persisted for the endpoint (`telemetry on --proxy-base <url>`) is what reaches it; a CAMPAIGNS_OS_TELEMETRY=on override alone does not, because an env grant carries no scope and the remit refuses an unscoped grant for a non-canonical endpoint (scope_bypassed). That is why the four session conditions — which run with consent off for a row declaring no consent-gated send — saw no request, and why this row once declared none."
|
|
1725
|
+
},
|
|
1726
|
+
{
|
|
1727
|
+
"command": "next",
|
|
1728
|
+
"subcommand": "deploy",
|
|
1729
|
+
"flags": [],
|
|
1730
|
+
"annotations": {
|
|
1731
|
+
"readOnlyHint": false,
|
|
1732
|
+
"destructiveHint": false,
|
|
1733
|
+
"openWorldHint": true,
|
|
1734
|
+
"idempotentHint": true
|
|
1735
|
+
},
|
|
1736
|
+
"tier": "A",
|
|
1737
|
+
"writes": [
|
|
1738
|
+
{
|
|
1739
|
+
"path": "{target}/.campaign-runtime/progress/**",
|
|
1740
|
+
"when": "always — the stage progress snapshot and its queued remit envelope are captured locally",
|
|
1741
|
+
"observed_in": [
|
|
1742
|
+
"no_session",
|
|
1743
|
+
"ambient_session",
|
|
1744
|
+
"stale_session",
|
|
1745
|
+
"lifecycle_log",
|
|
1746
|
+
"persisted_consent"
|
|
1747
|
+
]
|
|
1748
|
+
},
|
|
1749
|
+
{
|
|
1750
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
1751
|
+
"when": "the recomputed gates invalidate the retained doctor sidecar",
|
|
1752
|
+
"observed_in": [
|
|
1753
|
+
"no_session",
|
|
1754
|
+
"ambient_session",
|
|
1755
|
+
"stale_session",
|
|
1756
|
+
"lifecycle_log",
|
|
1757
|
+
"persisted_consent"
|
|
1758
|
+
]
|
|
1759
|
+
},
|
|
1760
|
+
{
|
|
1761
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
1762
|
+
"when": "an ambient run session is resolved for the invocation",
|
|
1763
|
+
"observed_in": [
|
|
1764
|
+
"ambient_session"
|
|
1765
|
+
]
|
|
1766
|
+
},
|
|
1767
|
+
{
|
|
1768
|
+
"path": "{lifecycle-journal}",
|
|
1769
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
1770
|
+
"observed_in": [
|
|
1771
|
+
"ambient_session",
|
|
1772
|
+
"lifecycle_log"
|
|
1773
|
+
]
|
|
1774
|
+
}
|
|
1775
|
+
],
|
|
1776
|
+
"sends": [
|
|
1777
|
+
{
|
|
1778
|
+
"destination": "{proxy-base}/api/progress",
|
|
1779
|
+
"what": "the stage progress observation — the snapshot just captured locally, POSTed under X-Campaign-Key",
|
|
1780
|
+
"when": "Run Telemetry consent is on for the endpoint, --no-remit and --no-write were not given, and the packet's campaign key resolves",
|
|
1781
|
+
"requires_consent": true,
|
|
1782
|
+
"observed_in": [
|
|
1783
|
+
"persisted_consent"
|
|
1784
|
+
]
|
|
1785
|
+
}
|
|
1786
|
+
],
|
|
1787
|
+
"effect_test": "effects: next deploy",
|
|
1788
|
+
"test_scope": "full",
|
|
1789
|
+
"notes": "next deploy recomputes that stage's gates and captures a progress snapshot. The local capture always happens; the .remit.json envelope beside each snapshot records what the delivery did. It SENDS the progress observation: the snapshot captured under .campaign-runtime/progress/ is POSTed to {proxy-base}/api/progress when Run Telemetry consent resolves ON for that endpoint and the packet's campaign key resolves. Consent persisted for the endpoint (`telemetry on --proxy-base <url>`) is what reaches it; a CAMPAIGNS_OS_TELEMETRY=on override alone does not, because an env grant carries no scope and the remit refuses an unscoped grant for a non-canonical endpoint (scope_bypassed). That is why the four session conditions — which run with consent off for a row declaring no consent-gated send — saw no request, and why this row once declared none."
|
|
1790
|
+
},
|
|
1791
|
+
{
|
|
1792
|
+
"command": "next",
|
|
1793
|
+
"subcommand": "qa",
|
|
1794
|
+
"flags": [],
|
|
1795
|
+
"annotations": {
|
|
1796
|
+
"readOnlyHint": false,
|
|
1797
|
+
"destructiveHint": false,
|
|
1798
|
+
"openWorldHint": true,
|
|
1799
|
+
"idempotentHint": true
|
|
1800
|
+
},
|
|
1801
|
+
"tier": "A",
|
|
1802
|
+
"writes": [
|
|
1803
|
+
{
|
|
1804
|
+
"path": "{target}/.campaign-runtime/progress/**",
|
|
1805
|
+
"when": "always — the stage progress snapshot and its queued remit envelope are captured locally",
|
|
1806
|
+
"observed_in": [
|
|
1807
|
+
"no_session",
|
|
1808
|
+
"ambient_session",
|
|
1809
|
+
"stale_session",
|
|
1810
|
+
"lifecycle_log",
|
|
1811
|
+
"persisted_consent"
|
|
1812
|
+
]
|
|
1813
|
+
},
|
|
1814
|
+
{
|
|
1815
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
1816
|
+
"when": "the recomputed gates invalidate the retained doctor sidecar",
|
|
1817
|
+
"observed_in": [
|
|
1818
|
+
"no_session",
|
|
1819
|
+
"ambient_session",
|
|
1820
|
+
"stale_session",
|
|
1821
|
+
"lifecycle_log",
|
|
1822
|
+
"persisted_consent"
|
|
1823
|
+
]
|
|
1824
|
+
},
|
|
1825
|
+
{
|
|
1826
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
1827
|
+
"when": "an ambient run session is resolved for the invocation",
|
|
1828
|
+
"observed_in": [
|
|
1829
|
+
"ambient_session"
|
|
1830
|
+
]
|
|
1831
|
+
},
|
|
1832
|
+
{
|
|
1833
|
+
"path": "{lifecycle-journal}",
|
|
1834
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
1835
|
+
"observed_in": [
|
|
1836
|
+
"ambient_session",
|
|
1837
|
+
"lifecycle_log"
|
|
1838
|
+
]
|
|
1839
|
+
}
|
|
1840
|
+
],
|
|
1841
|
+
"sends": [
|
|
1842
|
+
{
|
|
1843
|
+
"destination": "{proxy-base}/api/progress",
|
|
1844
|
+
"what": "the stage progress observation — the snapshot just captured locally, POSTed under X-Campaign-Key",
|
|
1845
|
+
"when": "Run Telemetry consent is on for the endpoint, --no-remit and --no-write were not given, and the packet's campaign key resolves",
|
|
1846
|
+
"requires_consent": true,
|
|
1847
|
+
"observed_in": [
|
|
1848
|
+
"persisted_consent"
|
|
1849
|
+
]
|
|
1850
|
+
}
|
|
1851
|
+
],
|
|
1852
|
+
"effect_test": "effects: next qa",
|
|
1853
|
+
"test_scope": "full",
|
|
1854
|
+
"notes": "next qa recomputes that stage's gates and captures a progress snapshot. The local capture always happens; the .remit.json envelope beside each snapshot records what the delivery did. It SENDS the progress observation: the snapshot captured under .campaign-runtime/progress/ is POSTed to {proxy-base}/api/progress when Run Telemetry consent resolves ON for that endpoint and the packet's campaign key resolves. Consent persisted for the endpoint (`telemetry on --proxy-base <url>`) is what reaches it; a CAMPAIGNS_OS_TELEMETRY=on override alone does not, because an env grant carries no scope and the remit refuses an unscoped grant for a non-canonical endpoint (scope_bypassed). That is why the four session conditions — which run with consent off for a row declaring no consent-gated send — saw no request, and why this row once declared none."
|
|
1855
|
+
},
|
|
1856
|
+
{
|
|
1857
|
+
"command": "next",
|
|
1858
|
+
"subcommand": null,
|
|
1859
|
+
"flags": [
|
|
1860
|
+
"--no-remit"
|
|
1861
|
+
],
|
|
1862
|
+
"annotations": {
|
|
1863
|
+
"readOnlyHint": false,
|
|
1864
|
+
"destructiveHint": false,
|
|
1865
|
+
"openWorldHint": false,
|
|
1866
|
+
"idempotentHint": true
|
|
1867
|
+
},
|
|
1868
|
+
"tier": "B",
|
|
1869
|
+
"writes": [
|
|
1870
|
+
{
|
|
1871
|
+
"path": "{target}/.campaign-runtime/progress/**",
|
|
1872
|
+
"when": "always — the stage progress snapshot and its queued remit envelope are captured locally",
|
|
1873
|
+
"observed_in": [
|
|
1874
|
+
"no_session",
|
|
1875
|
+
"ambient_session",
|
|
1876
|
+
"stale_session",
|
|
1877
|
+
"lifecycle_log",
|
|
1878
|
+
"persisted_consent"
|
|
1879
|
+
]
|
|
1880
|
+
},
|
|
1881
|
+
{
|
|
1882
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
1883
|
+
"when": "the recomputed gates invalidate the retained doctor sidecar",
|
|
1884
|
+
"observed_in": [
|
|
1885
|
+
"no_session",
|
|
1886
|
+
"ambient_session",
|
|
1887
|
+
"stale_session",
|
|
1888
|
+
"lifecycle_log",
|
|
1889
|
+
"persisted_consent"
|
|
1890
|
+
]
|
|
1891
|
+
},
|
|
1892
|
+
{
|
|
1893
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
1894
|
+
"when": "an ambient run session is resolved for the invocation",
|
|
1895
|
+
"observed_in": [
|
|
1896
|
+
"ambient_session"
|
|
1897
|
+
]
|
|
1898
|
+
},
|
|
1899
|
+
{
|
|
1900
|
+
"path": "{lifecycle-journal}",
|
|
1901
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
1902
|
+
"observed_in": [
|
|
1903
|
+
"ambient_session",
|
|
1904
|
+
"lifecycle_log"
|
|
1905
|
+
]
|
|
1906
|
+
}
|
|
1907
|
+
],
|
|
1908
|
+
"sends": [],
|
|
1909
|
+
"effect_test": "effects: next --no-remit",
|
|
1910
|
+
"test_scope": "full",
|
|
1911
|
+
"notes": "--no-remit suppresses the remit for this run. The local capture is unchanged, which is the point: capture is always local and consent gates only the send. No progress observation leaves the machine: the base `next` row declares that send, and this flag is what stops it (observed under persisted scoped consent, where the base form's POST is seen and this form's is not)."
|
|
1912
|
+
},
|
|
1913
|
+
{
|
|
1914
|
+
"command": "qa",
|
|
1915
|
+
"subcommand": "resolve",
|
|
1916
|
+
"flags": [],
|
|
1917
|
+
"annotations": {
|
|
1918
|
+
"readOnlyHint": false,
|
|
1919
|
+
"destructiveHint": false,
|
|
1920
|
+
"openWorldHint": true,
|
|
1921
|
+
"idempotentHint": true
|
|
1922
|
+
},
|
|
1923
|
+
"tier": "A",
|
|
1924
|
+
"writes": [
|
|
1925
|
+
{
|
|
1926
|
+
"path": "{lifecycle-journal}",
|
|
1927
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
1928
|
+
"observed_in": [
|
|
1929
|
+
"ambient_session",
|
|
1930
|
+
"lifecycle_log"
|
|
1931
|
+
]
|
|
1932
|
+
}
|
|
1933
|
+
],
|
|
1934
|
+
"sends": [
|
|
1935
|
+
{
|
|
1936
|
+
"destination": "{base-url}",
|
|
1937
|
+
"what": "an HTTP probe of each derived entry URL",
|
|
1938
|
+
"when": "the resolution is not blocked before the probe",
|
|
1939
|
+
"requires_consent": false,
|
|
1940
|
+
"observed_in": [],
|
|
1941
|
+
"not_observed_reason": "the offline fixture's resolution comes back blocked before a probe is issued, so no request leaves for the derived entry URLs"
|
|
1942
|
+
}
|
|
1943
|
+
],
|
|
1944
|
+
"effect_test": "effects: qa resolve (preflight)",
|
|
1945
|
+
"test_scope": "preflight",
|
|
1946
|
+
"notes": "PREFLIGHT-PROVED: the probe needs a resolution that is not blocked. The case proves the blocked resolution contacts the loopback stand-in for --base-url zero times and writes nothing but the lifecycle entry.",
|
|
1947
|
+
"preflight": {
|
|
1948
|
+
"may_write": [
|
|
1949
|
+
"{lifecycle-journal}"
|
|
1950
|
+
],
|
|
1951
|
+
"may_contact": []
|
|
1952
|
+
}
|
|
1953
|
+
},
|
|
1954
|
+
{
|
|
1955
|
+
"command": "qa",
|
|
1956
|
+
"subcommand": "resolve",
|
|
1957
|
+
"flags": [
|
|
1958
|
+
"--no-probe"
|
|
1959
|
+
],
|
|
1960
|
+
"annotations": {
|
|
1961
|
+
"readOnlyHint": false,
|
|
1962
|
+
"destructiveHint": false,
|
|
1963
|
+
"openWorldHint": false,
|
|
1964
|
+
"idempotentHint": true
|
|
1965
|
+
},
|
|
1966
|
+
"tier": "B",
|
|
1967
|
+
"writes": [
|
|
1968
|
+
{
|
|
1969
|
+
"path": "{lifecycle-journal}",
|
|
1970
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
1971
|
+
"observed_in": [
|
|
1972
|
+
"ambient_session",
|
|
1973
|
+
"lifecycle_log"
|
|
1974
|
+
]
|
|
1975
|
+
}
|
|
1976
|
+
],
|
|
1977
|
+
"sends": [],
|
|
1978
|
+
"effect_test": "effects: qa resolve --no-probe",
|
|
1979
|
+
"test_scope": "full",
|
|
1980
|
+
"notes": "--no-probe removes the only send: the URLs are derived and reported ready_unprobed. Only the lifecycle journal is written."
|
|
1981
|
+
},
|
|
1982
|
+
{
|
|
1983
|
+
"command": "qa",
|
|
1984
|
+
"subcommand": "run",
|
|
1985
|
+
"flags": [],
|
|
1986
|
+
"annotations": {
|
|
1987
|
+
"readOnlyHint": false,
|
|
1988
|
+
"destructiveHint": true,
|
|
1989
|
+
"openWorldHint": true,
|
|
1990
|
+
"idempotentHint": false
|
|
1991
|
+
},
|
|
1992
|
+
"tier": "C",
|
|
1993
|
+
"writes": [
|
|
1994
|
+
{
|
|
1995
|
+
"path": "{target}/qa-output/**",
|
|
1996
|
+
"when": "always — the full verdict for the attempt is written to the qa-output tree",
|
|
1997
|
+
"observed_in": [
|
|
1998
|
+
"no_session",
|
|
1999
|
+
"ambient_session",
|
|
2000
|
+
"stale_session",
|
|
2001
|
+
"lifecycle_log",
|
|
2002
|
+
"persisted_consent"
|
|
2003
|
+
]
|
|
2004
|
+
},
|
|
2005
|
+
{
|
|
2006
|
+
"path": "{cwd}/.campaign-runtime/qa-verdict.json",
|
|
2007
|
+
"when": "always — the committed verdict sidecar is projected from the attempt",
|
|
2008
|
+
"observed_in": [
|
|
2009
|
+
"no_session",
|
|
2010
|
+
"ambient_session",
|
|
2011
|
+
"stale_session",
|
|
2012
|
+
"lifecycle_log",
|
|
2013
|
+
"persisted_consent"
|
|
2014
|
+
]
|
|
2015
|
+
},
|
|
2016
|
+
{
|
|
2017
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
2018
|
+
"when": "always — the QA stage outcome is recorded on the report",
|
|
2019
|
+
"observed_in": [
|
|
2020
|
+
"no_session",
|
|
2021
|
+
"ambient_session",
|
|
2022
|
+
"stale_session",
|
|
2023
|
+
"lifecycle_log",
|
|
2024
|
+
"persisted_consent"
|
|
2025
|
+
]
|
|
2026
|
+
},
|
|
2027
|
+
{
|
|
2028
|
+
"path": "{target}/.campaign-runtime/progress/**",
|
|
2029
|
+
"when": "always — the QA stage progress snapshot is captured locally",
|
|
2030
|
+
"observed_in": [
|
|
2031
|
+
"no_session",
|
|
2032
|
+
"ambient_session",
|
|
2033
|
+
"stale_session",
|
|
2034
|
+
"lifecycle_log",
|
|
2035
|
+
"persisted_consent"
|
|
2036
|
+
]
|
|
2037
|
+
},
|
|
2038
|
+
{
|
|
2039
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
2040
|
+
"when": "the QA outcome invalidates the retained doctor sidecar",
|
|
2041
|
+
"observed_in": [
|
|
2042
|
+
"no_session",
|
|
2043
|
+
"ambient_session",
|
|
2044
|
+
"stale_session",
|
|
2045
|
+
"lifecycle_log",
|
|
2046
|
+
"persisted_consent"
|
|
2047
|
+
]
|
|
2048
|
+
},
|
|
2049
|
+
{
|
|
2050
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
2051
|
+
"when": "an ambient run session is resolved; a blocked attempt keeps it open, a ready verdict clears it",
|
|
2052
|
+
"observed_in": [
|
|
2053
|
+
"ambient_session"
|
|
2054
|
+
]
|
|
2055
|
+
},
|
|
2056
|
+
{
|
|
2057
|
+
"path": "{lifecycle-journal}",
|
|
2058
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
2059
|
+
"observed_in": [
|
|
2060
|
+
"ambient_session",
|
|
2061
|
+
"lifecycle_log"
|
|
2062
|
+
]
|
|
2063
|
+
}
|
|
2064
|
+
],
|
|
2065
|
+
"sends": [
|
|
2066
|
+
{
|
|
2067
|
+
"destination": "{proxy-base}/api/qa/verdicts",
|
|
2068
|
+
"what": "the QA verdict for the attempt, published to the QA portal",
|
|
2069
|
+
"when": "publish is not opted out (--no-post-verdict) and the consent seam allows it — Run Telemetry consent on for the endpoint, or a portal-managed campaign",
|
|
2070
|
+
"requires_consent": true,
|
|
2071
|
+
"observed_in": [
|
|
2072
|
+
"persisted_consent"
|
|
2073
|
+
]
|
|
2074
|
+
},
|
|
2075
|
+
{
|
|
2076
|
+
"destination": "{base-url}",
|
|
2077
|
+
"what": "HTTP requests against the campaign under test",
|
|
2078
|
+
"when": "always",
|
|
2079
|
+
"requires_consent": false,
|
|
2080
|
+
"observed_in": [],
|
|
2081
|
+
"not_observed_reason": "the offline fixture is blocked at the theme/proof gate before the campaign is reached, so no request leaves for the base URL"
|
|
2082
|
+
},
|
|
2083
|
+
{
|
|
2084
|
+
"destination": "{proxy-base}/api/runs",
|
|
2085
|
+
"what": "the Run Record / progress remit envelope for this run",
|
|
2086
|
+
"when": "Run Telemetry consent is on for the endpoint and --no-remit was not given",
|
|
2087
|
+
"requires_consent": true,
|
|
2088
|
+
"observed_in": [],
|
|
2089
|
+
"not_observed_reason": "a blocked attempt keeps the session open and assembles no Run Record, so nothing is remitted"
|
|
2090
|
+
},
|
|
2091
|
+
{
|
|
2092
|
+
"destination": "{proxy-base}/api/progress",
|
|
2093
|
+
"what": "the stage progress observation — the snapshot just captured locally, POSTed under X-Campaign-Key",
|
|
2094
|
+
"when": "Run Telemetry consent is on for the endpoint, --no-remit was not given, and the packet's campaign key resolves",
|
|
2095
|
+
"requires_consent": true,
|
|
2096
|
+
"observed_in": [
|
|
2097
|
+
"persisted_consent"
|
|
2098
|
+
]
|
|
2099
|
+
}
|
|
2100
|
+
],
|
|
2101
|
+
"effect_test": "effects: qa run",
|
|
2102
|
+
"test_scope": "full",
|
|
2103
|
+
"notes": "Destructive and not idempotent: each attempt overwrites the committed verdict sidecar and the report's QA stage, and a ready verdict clears the ambient run session. It SENDS on a blocked attempt too: the verdict is published to {proxy-base}/api/qa/verdicts and the QA stage progress observation to {proxy-base}/api/progress, both under persisted consent for the endpoint. Publishing rides the telemetry consent seam rather than a flag of its own, so the four consent-off conditions saw neither request."
|
|
2104
|
+
},
|
|
2105
|
+
{
|
|
2106
|
+
"command": "qa",
|
|
2107
|
+
"subcommand": "run",
|
|
2108
|
+
"flags": [
|
|
2109
|
+
"--no-remit"
|
|
2110
|
+
],
|
|
2111
|
+
"annotations": {
|
|
2112
|
+
"readOnlyHint": false,
|
|
2113
|
+
"destructiveHint": true,
|
|
2114
|
+
"openWorldHint": true,
|
|
2115
|
+
"idempotentHint": false
|
|
2116
|
+
},
|
|
2117
|
+
"tier": "C",
|
|
2118
|
+
"writes": [
|
|
2119
|
+
{
|
|
2120
|
+
"path": "{target}/qa-output/**",
|
|
2121
|
+
"when": "always — the full verdict for the attempt is written to the qa-output tree",
|
|
2122
|
+
"observed_in": [
|
|
2123
|
+
"no_session",
|
|
2124
|
+
"ambient_session",
|
|
2125
|
+
"stale_session",
|
|
2126
|
+
"lifecycle_log",
|
|
2127
|
+
"persisted_consent"
|
|
2128
|
+
]
|
|
2129
|
+
},
|
|
2130
|
+
{
|
|
2131
|
+
"path": "{cwd}/.campaign-runtime/qa-verdict.json",
|
|
2132
|
+
"when": "always — the committed verdict sidecar is projected from the attempt",
|
|
2133
|
+
"observed_in": [
|
|
2134
|
+
"no_session",
|
|
2135
|
+
"ambient_session",
|
|
2136
|
+
"stale_session",
|
|
2137
|
+
"lifecycle_log",
|
|
2138
|
+
"persisted_consent"
|
|
2139
|
+
]
|
|
2140
|
+
},
|
|
2141
|
+
{
|
|
2142
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
2143
|
+
"when": "always — the QA stage outcome is recorded on the report",
|
|
2144
|
+
"observed_in": [
|
|
2145
|
+
"no_session",
|
|
2146
|
+
"ambient_session",
|
|
2147
|
+
"stale_session",
|
|
2148
|
+
"lifecycle_log",
|
|
2149
|
+
"persisted_consent"
|
|
2150
|
+
]
|
|
2151
|
+
},
|
|
2152
|
+
{
|
|
2153
|
+
"path": "{target}/.campaign-runtime/progress/**",
|
|
2154
|
+
"when": "always — the QA stage progress snapshot is captured locally",
|
|
2155
|
+
"observed_in": [
|
|
2156
|
+
"no_session",
|
|
2157
|
+
"ambient_session",
|
|
2158
|
+
"stale_session",
|
|
2159
|
+
"lifecycle_log",
|
|
2160
|
+
"persisted_consent"
|
|
2161
|
+
]
|
|
2162
|
+
},
|
|
2163
|
+
{
|
|
2164
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
2165
|
+
"when": "the QA outcome invalidates the retained doctor sidecar",
|
|
2166
|
+
"observed_in": [
|
|
2167
|
+
"no_session",
|
|
2168
|
+
"ambient_session",
|
|
2169
|
+
"stale_session",
|
|
2170
|
+
"lifecycle_log",
|
|
2171
|
+
"persisted_consent"
|
|
2172
|
+
]
|
|
2173
|
+
},
|
|
2174
|
+
{
|
|
2175
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
2176
|
+
"when": "an ambient run session is resolved; a blocked attempt keeps it open, a ready verdict clears it",
|
|
2177
|
+
"observed_in": [
|
|
2178
|
+
"ambient_session"
|
|
2179
|
+
]
|
|
2180
|
+
},
|
|
2181
|
+
{
|
|
2182
|
+
"path": "{lifecycle-journal}",
|
|
2183
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
2184
|
+
"observed_in": [
|
|
2185
|
+
"ambient_session",
|
|
2186
|
+
"lifecycle_log"
|
|
2187
|
+
]
|
|
2188
|
+
}
|
|
2189
|
+
],
|
|
2190
|
+
"sends": [
|
|
2191
|
+
{
|
|
2192
|
+
"destination": "{proxy-base}/api/qa/verdicts",
|
|
2193
|
+
"what": "the QA verdict for the attempt, published to the QA portal",
|
|
2194
|
+
"when": "publish is not opted out (--no-post-verdict) and the consent seam allows it — Run Telemetry consent on for the endpoint, or a portal-managed campaign",
|
|
2195
|
+
"requires_consent": true,
|
|
2196
|
+
"observed_in": [
|
|
2197
|
+
"persisted_consent"
|
|
2198
|
+
]
|
|
2199
|
+
},
|
|
2200
|
+
{
|
|
2201
|
+
"destination": "{base-url}",
|
|
2202
|
+
"what": "HTTP requests against the campaign under test",
|
|
2203
|
+
"when": "always",
|
|
2204
|
+
"requires_consent": false,
|
|
2205
|
+
"observed_in": [],
|
|
2206
|
+
"not_observed_reason": "the offline fixture is blocked at the theme/proof gate before the campaign is reached, so no request leaves for the base URL"
|
|
2207
|
+
},
|
|
2208
|
+
{
|
|
2209
|
+
"destination": "{proxy-base}/api/runs",
|
|
2210
|
+
"what": "the Run Record / progress remit envelope for this run",
|
|
2211
|
+
"when": "Run Telemetry consent is on for the endpoint and --no-remit was not given",
|
|
2212
|
+
"requires_consent": true,
|
|
2213
|
+
"observed_in": [],
|
|
2214
|
+
"not_observed_reason": "a blocked attempt keeps the session open and assembles no Run Record, so nothing is remitted"
|
|
2215
|
+
}
|
|
2216
|
+
],
|
|
2217
|
+
"effect_test": "effects: qa run --no-remit",
|
|
2218
|
+
"test_scope": "full",
|
|
2219
|
+
"notes": "The base `qa run` row's writes, without any remit: --no-remit stops the progress observation and the Run Record remit. The verdict publish is NOT a remit and is not gated by the flag — it still posts to the QA portal under the consent seam, which --no-post-verdict is the opt-out from."
|
|
2220
|
+
},
|
|
2221
|
+
{
|
|
2222
|
+
"command": "qa",
|
|
2223
|
+
"subcommand": "run",
|
|
2224
|
+
"flags": [
|
|
2225
|
+
"--no-post-verdict"
|
|
2226
|
+
],
|
|
2227
|
+
"annotations": {
|
|
2228
|
+
"readOnlyHint": false,
|
|
2229
|
+
"destructiveHint": true,
|
|
2230
|
+
"openWorldHint": true,
|
|
2231
|
+
"idempotentHint": false
|
|
2232
|
+
},
|
|
2233
|
+
"tier": "C",
|
|
2234
|
+
"writes": [
|
|
2235
|
+
{
|
|
2236
|
+
"path": "{target}/qa-output/**",
|
|
2237
|
+
"when": "always — the full verdict for the attempt is written to the qa-output tree",
|
|
2238
|
+
"observed_in": [
|
|
2239
|
+
"no_session",
|
|
2240
|
+
"ambient_session",
|
|
2241
|
+
"stale_session",
|
|
2242
|
+
"lifecycle_log",
|
|
2243
|
+
"persisted_consent"
|
|
2244
|
+
]
|
|
2245
|
+
},
|
|
2246
|
+
{
|
|
2247
|
+
"path": "{cwd}/.campaign-runtime/qa-verdict.json",
|
|
2248
|
+
"when": "always — the committed verdict sidecar is projected from the attempt",
|
|
2249
|
+
"observed_in": [
|
|
2250
|
+
"no_session",
|
|
2251
|
+
"ambient_session",
|
|
2252
|
+
"stale_session",
|
|
2253
|
+
"lifecycle_log",
|
|
2254
|
+
"persisted_consent"
|
|
2255
|
+
]
|
|
2256
|
+
},
|
|
2257
|
+
{
|
|
2258
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
2259
|
+
"when": "always — the QA stage outcome is recorded on the report",
|
|
2260
|
+
"observed_in": [
|
|
2261
|
+
"no_session",
|
|
2262
|
+
"ambient_session",
|
|
2263
|
+
"stale_session",
|
|
2264
|
+
"lifecycle_log",
|
|
2265
|
+
"persisted_consent"
|
|
2266
|
+
]
|
|
2267
|
+
},
|
|
2268
|
+
{
|
|
2269
|
+
"path": "{target}/.campaign-runtime/progress/**",
|
|
2270
|
+
"when": "always — the QA stage progress snapshot is captured locally",
|
|
2271
|
+
"observed_in": [
|
|
2272
|
+
"no_session",
|
|
2273
|
+
"ambient_session",
|
|
2274
|
+
"stale_session",
|
|
2275
|
+
"lifecycle_log",
|
|
2276
|
+
"persisted_consent"
|
|
2277
|
+
]
|
|
2278
|
+
},
|
|
2279
|
+
{
|
|
2280
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
2281
|
+
"when": "the QA outcome invalidates the retained doctor sidecar",
|
|
2282
|
+
"observed_in": [
|
|
2283
|
+
"no_session",
|
|
2284
|
+
"ambient_session",
|
|
2285
|
+
"stale_session",
|
|
2286
|
+
"lifecycle_log",
|
|
2287
|
+
"persisted_consent"
|
|
2288
|
+
]
|
|
2289
|
+
},
|
|
2290
|
+
{
|
|
2291
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
2292
|
+
"when": "an ambient run session is resolved; a blocked attempt keeps it open, a ready verdict clears it",
|
|
2293
|
+
"observed_in": [
|
|
2294
|
+
"ambient_session"
|
|
2295
|
+
]
|
|
2296
|
+
},
|
|
2297
|
+
{
|
|
2298
|
+
"path": "{lifecycle-journal}",
|
|
2299
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
2300
|
+
"observed_in": [
|
|
2301
|
+
"ambient_session",
|
|
2302
|
+
"lifecycle_log"
|
|
2303
|
+
]
|
|
2304
|
+
}
|
|
2305
|
+
],
|
|
2306
|
+
"sends": [
|
|
2307
|
+
{
|
|
2308
|
+
"destination": "{base-url}",
|
|
2309
|
+
"what": "HTTP requests against the campaign under test",
|
|
2310
|
+
"when": "always",
|
|
2311
|
+
"requires_consent": false,
|
|
2312
|
+
"observed_in": [],
|
|
2313
|
+
"not_observed_reason": "the offline fixture is blocked at the theme/proof gate before the campaign is reached, so no request leaves for the base URL"
|
|
2314
|
+
},
|
|
2315
|
+
{
|
|
2316
|
+
"destination": "{proxy-base}/api/runs",
|
|
2317
|
+
"what": "the Run Record / progress remit envelope for this run",
|
|
2318
|
+
"when": "Run Telemetry consent is on for the endpoint and --no-remit was not given",
|
|
2319
|
+
"requires_consent": true,
|
|
2320
|
+
"observed_in": [],
|
|
2321
|
+
"not_observed_reason": "a blocked attempt keeps the session open and assembles no Run Record, so nothing is remitted"
|
|
2322
|
+
},
|
|
2323
|
+
{
|
|
2324
|
+
"destination": "{proxy-base}/api/progress",
|
|
2325
|
+
"what": "the stage progress observation — the snapshot just captured locally, POSTed under X-Campaign-Key",
|
|
2326
|
+
"when": "Run Telemetry consent is on for the endpoint, --no-remit was not given, and the packet's campaign key resolves",
|
|
2327
|
+
"requires_consent": true,
|
|
2328
|
+
"observed_in": [
|
|
2329
|
+
"persisted_consent"
|
|
2330
|
+
]
|
|
2331
|
+
}
|
|
2332
|
+
],
|
|
2333
|
+
"effect_test": "effects: qa run --no-post-verdict",
|
|
2334
|
+
"test_scope": "full",
|
|
2335
|
+
"notes": "The base `qa run` row's writes, without the verdict publish: --no-post-verdict is the opt-out from posting the verdict to the QA portal. The progress observation is a separate delivery and still leaves under persisted consent; --no-remit is the flag that stops that one."
|
|
2336
|
+
},
|
|
2337
|
+
{
|
|
2338
|
+
"command": "qa",
|
|
2339
|
+
"subcommand": "run",
|
|
2340
|
+
"flags": [
|
|
2341
|
+
"--test-order"
|
|
2342
|
+
],
|
|
2343
|
+
"annotations": {
|
|
2344
|
+
"readOnlyHint": false,
|
|
2345
|
+
"destructiveHint": true,
|
|
2346
|
+
"openWorldHint": true,
|
|
2347
|
+
"idempotentHint": false
|
|
2348
|
+
},
|
|
2349
|
+
"tier": "C",
|
|
2350
|
+
"writes": [
|
|
2351
|
+
{
|
|
2352
|
+
"path": "{target}/qa-output/**",
|
|
2353
|
+
"when": "always — the full verdict for the attempt is written to the qa-output tree",
|
|
2354
|
+
"observed_in": [
|
|
2355
|
+
"no_session",
|
|
2356
|
+
"ambient_session",
|
|
2357
|
+
"stale_session",
|
|
2358
|
+
"lifecycle_log",
|
|
2359
|
+
"persisted_consent"
|
|
2360
|
+
]
|
|
2361
|
+
},
|
|
2362
|
+
{
|
|
2363
|
+
"path": "{cwd}/.campaign-runtime/qa-verdict.json",
|
|
2364
|
+
"when": "always — the committed verdict sidecar is projected from the attempt",
|
|
2365
|
+
"observed_in": [
|
|
2366
|
+
"no_session",
|
|
2367
|
+
"ambient_session",
|
|
2368
|
+
"stale_session",
|
|
2369
|
+
"lifecycle_log",
|
|
2370
|
+
"persisted_consent"
|
|
2371
|
+
]
|
|
2372
|
+
},
|
|
2373
|
+
{
|
|
2374
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
2375
|
+
"when": "always — the QA stage outcome is recorded on the report",
|
|
2376
|
+
"observed_in": [
|
|
2377
|
+
"no_session",
|
|
2378
|
+
"ambient_session",
|
|
2379
|
+
"stale_session",
|
|
2380
|
+
"lifecycle_log",
|
|
2381
|
+
"persisted_consent"
|
|
2382
|
+
]
|
|
2383
|
+
},
|
|
2384
|
+
{
|
|
2385
|
+
"path": "{target}/.campaign-runtime/progress/**",
|
|
2386
|
+
"when": "always — the QA stage progress snapshot is captured locally",
|
|
2387
|
+
"observed_in": [
|
|
2388
|
+
"no_session",
|
|
2389
|
+
"ambient_session",
|
|
2390
|
+
"stale_session",
|
|
2391
|
+
"lifecycle_log",
|
|
2392
|
+
"persisted_consent"
|
|
2393
|
+
]
|
|
2394
|
+
},
|
|
2395
|
+
{
|
|
2396
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
2397
|
+
"when": "the QA outcome invalidates the retained doctor sidecar",
|
|
2398
|
+
"observed_in": [
|
|
2399
|
+
"no_session",
|
|
2400
|
+
"ambient_session",
|
|
2401
|
+
"stale_session",
|
|
2402
|
+
"lifecycle_log",
|
|
2403
|
+
"persisted_consent"
|
|
2404
|
+
]
|
|
2405
|
+
},
|
|
2406
|
+
{
|
|
2407
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
2408
|
+
"when": "an ambient run session is resolved; a blocked attempt keeps it open, a ready verdict clears it",
|
|
2409
|
+
"observed_in": [
|
|
2410
|
+
"ambient_session"
|
|
2411
|
+
]
|
|
2412
|
+
},
|
|
2413
|
+
{
|
|
2414
|
+
"path": "{lifecycle-journal}",
|
|
2415
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
2416
|
+
"observed_in": [
|
|
2417
|
+
"ambient_session",
|
|
2418
|
+
"lifecycle_log"
|
|
2419
|
+
]
|
|
2420
|
+
}
|
|
2421
|
+
],
|
|
2422
|
+
"sends": [
|
|
2423
|
+
{
|
|
2424
|
+
"destination": "{proxy-base}/api/qa/verdicts",
|
|
2425
|
+
"what": "the QA verdict for the attempt, published to the QA portal",
|
|
2426
|
+
"when": "publish is not opted out (--no-post-verdict) and the consent seam allows it — Run Telemetry consent on for the endpoint, or a portal-managed campaign",
|
|
2427
|
+
"requires_consent": true,
|
|
2428
|
+
"observed_in": [
|
|
2429
|
+
"persisted_consent"
|
|
2430
|
+
]
|
|
2431
|
+
},
|
|
2432
|
+
{
|
|
2433
|
+
"destination": "{base-url}",
|
|
2434
|
+
"what": "HTTP requests against the campaign under test, INCLUDING order creation against the live store",
|
|
2435
|
+
"when": "always",
|
|
2436
|
+
"requires_consent": false,
|
|
2437
|
+
"observed_in": [],
|
|
2438
|
+
"not_observed_reason": "the offline fixture is blocked before the order ladder is reached; the mode is proved by the gate refusing without placing an order"
|
|
2439
|
+
},
|
|
2440
|
+
{
|
|
2441
|
+
"destination": "{proxy-base}/api/runs",
|
|
2442
|
+
"what": "the Run Record / progress remit envelope for this run",
|
|
2443
|
+
"when": "Run Telemetry consent is on for the endpoint and --no-remit was not given",
|
|
2444
|
+
"requires_consent": true,
|
|
2445
|
+
"observed_in": [],
|
|
2446
|
+
"not_observed_reason": "a blocked attempt assembles no Run Record, so nothing is remitted"
|
|
2447
|
+
},
|
|
2448
|
+
{
|
|
2449
|
+
"destination": "{proxy-base}/api/progress",
|
|
2450
|
+
"what": "the stage progress observation — the snapshot just captured locally, POSTed under X-Campaign-Key",
|
|
2451
|
+
"when": "Run Telemetry consent is on for the endpoint, --no-remit was not given, and the packet's campaign key resolves",
|
|
2452
|
+
"requires_consent": true,
|
|
2453
|
+
"observed_in": [
|
|
2454
|
+
"persisted_consent"
|
|
2455
|
+
]
|
|
2456
|
+
}
|
|
2457
|
+
],
|
|
2458
|
+
"effect_test": "effects: qa run --test-order",
|
|
2459
|
+
"test_scope": "full",
|
|
2460
|
+
"notes": "The most consequential row in the file: --test-order places REAL orders against the store under test. Destructive, open-world, not idempotent. It SENDS on a blocked attempt too: the verdict is published to {proxy-base}/api/qa/verdicts and the QA stage progress observation to {proxy-base}/api/progress, both under persisted consent for the endpoint. Publishing rides the telemetry consent seam rather than a flag of its own, so the four consent-off conditions saw neither request."
|
|
2461
|
+
},
|
|
2462
|
+
{
|
|
2463
|
+
"command": "qa",
|
|
2464
|
+
"subcommand": "run",
|
|
2465
|
+
"flags": [
|
|
2466
|
+
"--browser"
|
|
2467
|
+
],
|
|
2468
|
+
"annotations": {
|
|
2469
|
+
"readOnlyHint": false,
|
|
2470
|
+
"destructiveHint": true,
|
|
2471
|
+
"openWorldHint": true,
|
|
2472
|
+
"idempotentHint": false
|
|
2473
|
+
},
|
|
2474
|
+
"tier": "C",
|
|
2475
|
+
"writes": [
|
|
2476
|
+
{
|
|
2477
|
+
"path": "{target}/qa-output/**",
|
|
2478
|
+
"when": "always — the full verdict for the attempt is written to the qa-output tree",
|
|
2479
|
+
"observed_in": [
|
|
2480
|
+
"no_session",
|
|
2481
|
+
"ambient_session",
|
|
2482
|
+
"stale_session",
|
|
2483
|
+
"lifecycle_log",
|
|
2484
|
+
"persisted_consent"
|
|
2485
|
+
]
|
|
2486
|
+
},
|
|
2487
|
+
{
|
|
2488
|
+
"path": "{cwd}/.campaign-runtime/qa-verdict.json",
|
|
2489
|
+
"when": "always — the committed verdict sidecar is projected from the attempt",
|
|
2490
|
+
"observed_in": [
|
|
2491
|
+
"no_session",
|
|
2492
|
+
"ambient_session",
|
|
2493
|
+
"stale_session",
|
|
2494
|
+
"lifecycle_log",
|
|
2495
|
+
"persisted_consent"
|
|
2496
|
+
]
|
|
2497
|
+
},
|
|
2498
|
+
{
|
|
2499
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
2500
|
+
"when": "always — the QA stage outcome is recorded on the report",
|
|
2501
|
+
"observed_in": [
|
|
2502
|
+
"no_session",
|
|
2503
|
+
"ambient_session",
|
|
2504
|
+
"stale_session",
|
|
2505
|
+
"lifecycle_log",
|
|
2506
|
+
"persisted_consent"
|
|
2507
|
+
]
|
|
2508
|
+
},
|
|
2509
|
+
{
|
|
2510
|
+
"path": "{target}/.campaign-runtime/progress/**",
|
|
2511
|
+
"when": "always — the QA stage progress snapshot is captured locally",
|
|
2512
|
+
"observed_in": [
|
|
2513
|
+
"no_session",
|
|
2514
|
+
"ambient_session",
|
|
2515
|
+
"stale_session",
|
|
2516
|
+
"lifecycle_log",
|
|
2517
|
+
"persisted_consent"
|
|
2518
|
+
]
|
|
2519
|
+
},
|
|
2520
|
+
{
|
|
2521
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
2522
|
+
"when": "the QA outcome invalidates the retained doctor sidecar",
|
|
2523
|
+
"observed_in": [
|
|
2524
|
+
"no_session",
|
|
2525
|
+
"ambient_session",
|
|
2526
|
+
"stale_session",
|
|
2527
|
+
"lifecycle_log",
|
|
2528
|
+
"persisted_consent"
|
|
2529
|
+
]
|
|
2530
|
+
},
|
|
2531
|
+
{
|
|
2532
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
2533
|
+
"when": "an ambient run session is resolved; a blocked attempt keeps it open, a ready verdict clears it",
|
|
2534
|
+
"observed_in": [
|
|
2535
|
+
"ambient_session"
|
|
2536
|
+
]
|
|
2537
|
+
},
|
|
2538
|
+
{
|
|
2539
|
+
"path": "{lifecycle-journal}",
|
|
2540
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
2541
|
+
"observed_in": [
|
|
2542
|
+
"ambient_session",
|
|
2543
|
+
"lifecycle_log"
|
|
2544
|
+
]
|
|
2545
|
+
}
|
|
2546
|
+
],
|
|
2547
|
+
"sends": [
|
|
2548
|
+
{
|
|
2549
|
+
"destination": "{proxy-base}/api/qa/verdicts",
|
|
2550
|
+
"what": "the QA verdict for the attempt, published to the QA portal",
|
|
2551
|
+
"when": "publish is not opted out (--no-post-verdict) and the consent seam allows it — Run Telemetry consent on for the endpoint, or a portal-managed campaign",
|
|
2552
|
+
"requires_consent": true,
|
|
2553
|
+
"observed_in": [
|
|
2554
|
+
"persisted_consent"
|
|
2555
|
+
]
|
|
2556
|
+
},
|
|
2557
|
+
{
|
|
2558
|
+
"destination": "{base-url}",
|
|
2559
|
+
"what": "browser navigation and HTTP requests against the campaign under test",
|
|
2560
|
+
"when": "a browser is installed and the gates pass",
|
|
2561
|
+
"requires_consent": false,
|
|
2562
|
+
"observed_in": [],
|
|
2563
|
+
"not_observed_reason": "the browser run cannot execute offline; the case proves the gate refusal"
|
|
2564
|
+
},
|
|
2565
|
+
{
|
|
2566
|
+
"destination": "{proxy-base}/api/runs",
|
|
2567
|
+
"what": "the Run Record / progress remit envelope for this run",
|
|
2568
|
+
"when": "Run Telemetry consent is on for the endpoint and --no-remit was not given",
|
|
2569
|
+
"requires_consent": true,
|
|
2570
|
+
"observed_in": [],
|
|
2571
|
+
"not_observed_reason": "a blocked attempt assembles no Run Record"
|
|
2572
|
+
},
|
|
2573
|
+
{
|
|
2574
|
+
"destination": "{proxy-base}/api/progress",
|
|
2575
|
+
"what": "the stage progress observation — the snapshot just captured locally, POSTed under X-Campaign-Key",
|
|
2576
|
+
"when": "Run Telemetry consent is on for the endpoint, --no-remit was not given, and the packet's campaign key resolves",
|
|
2577
|
+
"requires_consent": true,
|
|
2578
|
+
"observed_in": [
|
|
2579
|
+
"persisted_consent"
|
|
2580
|
+
]
|
|
2581
|
+
}
|
|
2582
|
+
],
|
|
2583
|
+
"effect_test": "effects: qa run --browser (preflight)",
|
|
2584
|
+
"test_scope": "preflight",
|
|
2585
|
+
"notes": "PREFLIGHT-PROVED: --browser needs an installed Chromium and a reachable campaign, neither of which exists offline. The case proves the attempt is blocked at the same gate as the node run and writes exactly the blocked-attempt evidence. It SENDS on a blocked attempt too: the verdict is published to {proxy-base}/api/qa/verdicts and the QA stage progress observation to {proxy-base}/api/progress, both under persisted consent for the endpoint. Publishing rides the telemetry consent seam rather than a flag of its own, so the four consent-off conditions saw neither request.",
|
|
2586
|
+
"preflight": {
|
|
2587
|
+
"may_write": [
|
|
2588
|
+
"{target}/qa-output/**",
|
|
2589
|
+
"{cwd}/.campaign-runtime/qa-verdict.json",
|
|
2590
|
+
"{target}/.campaign-runtime/assembly-report.json",
|
|
2591
|
+
"{target}/.campaign-runtime/progress/**",
|
|
2592
|
+
"{target}/.campaign-runtime/doctor-output.json",
|
|
2593
|
+
"{target}/.campaign-runtime/run-session.json",
|
|
2594
|
+
"{lifecycle-journal}"
|
|
2595
|
+
],
|
|
2596
|
+
"may_contact": [
|
|
2597
|
+
"/api/qa/verdicts",
|
|
2598
|
+
"/api/progress"
|
|
2599
|
+
]
|
|
2600
|
+
}
|
|
2601
|
+
},
|
|
2602
|
+
{
|
|
2603
|
+
"command": "qa",
|
|
2604
|
+
"subcommand": "publish",
|
|
2605
|
+
"flags": [],
|
|
2606
|
+
"annotations": {
|
|
2607
|
+
"readOnlyHint": false,
|
|
2608
|
+
"destructiveHint": false,
|
|
2609
|
+
"openWorldHint": true,
|
|
2610
|
+
"idempotentHint": true
|
|
2611
|
+
},
|
|
2612
|
+
"tier": "A",
|
|
2613
|
+
"writes": [
|
|
2614
|
+
{
|
|
2615
|
+
"path": "{lifecycle-journal}",
|
|
2616
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
2617
|
+
"observed_in": [
|
|
2618
|
+
"ambient_session",
|
|
2619
|
+
"lifecycle_log"
|
|
2620
|
+
]
|
|
2621
|
+
}
|
|
2622
|
+
],
|
|
2623
|
+
"sends": [
|
|
2624
|
+
{
|
|
2625
|
+
"destination": "{proxy-base}/api/qa/verdicts",
|
|
2626
|
+
"what": "the already-stored verdict",
|
|
2627
|
+
"when": "the verdict's spec_hash is current and it is not already published",
|
|
2628
|
+
"requires_consent": false,
|
|
2629
|
+
"observed_in": [
|
|
2630
|
+
"no_session",
|
|
2631
|
+
"ambient_session",
|
|
2632
|
+
"stale_session",
|
|
2633
|
+
"lifecycle_log",
|
|
2634
|
+
"persisted_consent"
|
|
2635
|
+
]
|
|
2636
|
+
}
|
|
2637
|
+
],
|
|
2638
|
+
"effect_test": "effects: qa publish",
|
|
2639
|
+
"test_scope": "full",
|
|
2640
|
+
"notes": "Posts an already-stored verdict without a re-run and without an order. It is NOT gated by Run Telemetry consent — the publish is the operator's explicit act."
|
|
2641
|
+
},
|
|
2642
|
+
{
|
|
2643
|
+
"command": "qa",
|
|
2644
|
+
"subcommand": "publish",
|
|
2645
|
+
"flags": [
|
|
2646
|
+
"--republish"
|
|
2647
|
+
],
|
|
2648
|
+
"annotations": {
|
|
2649
|
+
"readOnlyHint": false,
|
|
2650
|
+
"destructiveHint": false,
|
|
2651
|
+
"openWorldHint": true,
|
|
2652
|
+
"idempotentHint": true
|
|
2653
|
+
},
|
|
2654
|
+
"tier": "A",
|
|
2655
|
+
"writes": [
|
|
2656
|
+
{
|
|
2657
|
+
"path": "{lifecycle-journal}",
|
|
2658
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
2659
|
+
"observed_in": [
|
|
2660
|
+
"ambient_session",
|
|
2661
|
+
"lifecycle_log"
|
|
2662
|
+
]
|
|
2663
|
+
}
|
|
2664
|
+
],
|
|
2665
|
+
"sends": [
|
|
2666
|
+
{
|
|
2667
|
+
"destination": "{proxy-base}/api/qa/verdicts",
|
|
2668
|
+
"what": "the already-stored verdict",
|
|
2669
|
+
"when": "the verdict's spec_hash is current and it is not already published",
|
|
2670
|
+
"requires_consent": false,
|
|
2671
|
+
"observed_in": [
|
|
2672
|
+
"no_session",
|
|
2673
|
+
"ambient_session",
|
|
2674
|
+
"stale_session",
|
|
2675
|
+
"lifecycle_log",
|
|
2676
|
+
"persisted_consent"
|
|
2677
|
+
]
|
|
2678
|
+
}
|
|
2679
|
+
],
|
|
2680
|
+
"effect_test": "effects: qa publish --republish",
|
|
2681
|
+
"test_scope": "full",
|
|
2682
|
+
"notes": "--republish lifts the already-published refusal: the same POST to the QA portal for a verdict that was already delivered. Not destructive locally — nothing under the target is overwritten — and not gated by Run Telemetry consent."
|
|
2683
|
+
},
|
|
2684
|
+
{
|
|
2685
|
+
"command": "qa",
|
|
2686
|
+
"subcommand": "parity",
|
|
2687
|
+
"flags": [],
|
|
2688
|
+
"annotations": {
|
|
2689
|
+
"readOnlyHint": false,
|
|
2690
|
+
"destructiveHint": false,
|
|
2691
|
+
"openWorldHint": true,
|
|
2692
|
+
"idempotentHint": false
|
|
2693
|
+
},
|
|
2694
|
+
"tier": "A",
|
|
2695
|
+
"writes": [
|
|
2696
|
+
{
|
|
2697
|
+
"path": "{cwd}/qa-output/**",
|
|
2698
|
+
"when": "the capture completes — the evidence bundle (<run-id>.parity-bundle.json: the assessed order, the candidate capture and any baseline capture) and the full verdict, both under the fixture's campaign slug. `qa parity` takes no packet, so the directory is qa-output under the working directory unless --output-dir names another",
|
|
2699
|
+
"observed_in": [],
|
|
2700
|
+
"not_observed_reason": "the parity capture drives the candidate funnel through Playwright, and the refusal (\"Playwright Chromium is not installed\") lands before a page is opened, so the run never reaches the bundle write or the verdict"
|
|
2701
|
+
},
|
|
2702
|
+
{
|
|
2703
|
+
"path": "{lifecycle-journal}",
|
|
2704
|
+
"when": "a lifecycle journal is selected for the invocation — --lifecycle-journal or CAMPAIGNS_OS_LIFECYCLE_LOG. This invocation takes no --packet, so an ambient run session opened at a target repo is not its session and its journal is not selected",
|
|
2705
|
+
"observed_in": [
|
|
2706
|
+
"lifecycle_log"
|
|
2707
|
+
]
|
|
2708
|
+
}
|
|
2709
|
+
],
|
|
2710
|
+
"sends": [
|
|
2711
|
+
{
|
|
2712
|
+
"destination": "{base-url}",
|
|
2713
|
+
"what": "browser navigation and typed-card order traversal of the scenario's checkout and upsell routes against the candidate campaign — real orders through the deployed checkout",
|
|
2714
|
+
"when": "a Chromium is installed and the scenario's routes resolve; the base URL is --base-url, else the fixture's candidate_base_url",
|
|
2715
|
+
"requires_consent": false,
|
|
2716
|
+
"observed_in": [],
|
|
2717
|
+
"not_observed_reason": "no browser is installed in the fixture's pinned Playwright registry, so the capture is refused before the first navigation and the loopback stand-in for --base-url is never contacted"
|
|
2718
|
+
},
|
|
2719
|
+
{
|
|
2720
|
+
"destination": "{proxy-base}/api/qa/verdicts",
|
|
2721
|
+
"what": "the parity verdict for the attempt, published to the QA portal",
|
|
2722
|
+
"when": "publish is not opted out (--no-post-verdict) and the consent seam allows it — Run Telemetry consent on for the endpoint, or a portal-managed campaign",
|
|
2723
|
+
"requires_consent": true,
|
|
2724
|
+
"observed_in": [],
|
|
2725
|
+
"not_observed_reason": "the parity capture drives the candidate funnel through Playwright, and the refusal (\"Playwright Chromium is not installed\") lands before a page is opened, so the run never reaches the bundle write or the verdict"
|
|
2726
|
+
}
|
|
2727
|
+
],
|
|
2728
|
+
"effect_test": "effects: qa parity (preflight)",
|
|
2729
|
+
"test_scope": "preflight",
|
|
2730
|
+
"notes": "PREFLIGHT-PROVED: fixture-driven migration parity. The capture needs an installed Chromium and a reachable candidate funnel, neither of which exists offline; the effect fixture pins PLAYWRIGHT_BROWSERS_PATH at an empty registry inside the target so that is a fact of the fixture rather than of the machine. The case proves the refusal writes nothing but the lifecycle entry and contacts the loopback stand-in for --base-url zero times. Reads the fixture and (with --parity-order-json) a saved capture bundle; writes NOTHING under the packet or the target repo — `qa parity` takes no packet, projects no verdict sidecar and stamps no assembly report, which is what separates it from every `qa run` form.",
|
|
2731
|
+
"preflight": {
|
|
2732
|
+
"may_write": [
|
|
2733
|
+
"{lifecycle-journal}"
|
|
2734
|
+
],
|
|
2735
|
+
"may_contact": []
|
|
2736
|
+
}
|
|
2737
|
+
},
|
|
2738
|
+
{
|
|
2739
|
+
"command": "qa",
|
|
2740
|
+
"subcommand": "parity",
|
|
2741
|
+
"flags": [
|
|
2742
|
+
"--no-post-verdict"
|
|
2743
|
+
],
|
|
2744
|
+
"annotations": {
|
|
2745
|
+
"readOnlyHint": false,
|
|
2746
|
+
"destructiveHint": false,
|
|
2747
|
+
"openWorldHint": true,
|
|
2748
|
+
"idempotentHint": false
|
|
2749
|
+
},
|
|
2750
|
+
"tier": "A",
|
|
2751
|
+
"writes": [
|
|
2752
|
+
{
|
|
2753
|
+
"path": "{cwd}/qa-output/**",
|
|
2754
|
+
"when": "the capture completes — the evidence bundle (<run-id>.parity-bundle.json: the assessed order, the candidate capture and any baseline capture) and the full verdict, both under the fixture's campaign slug. `qa parity` takes no packet, so the directory is qa-output under the working directory unless --output-dir names another",
|
|
2755
|
+
"observed_in": [],
|
|
2756
|
+
"not_observed_reason": "the parity capture drives the candidate funnel through Playwright, and the refusal (\"Playwright Chromium is not installed\") lands before a page is opened, so the run never reaches the bundle write or the verdict"
|
|
2757
|
+
},
|
|
2758
|
+
{
|
|
2759
|
+
"path": "{lifecycle-journal}",
|
|
2760
|
+
"when": "a lifecycle journal is selected for the invocation — --lifecycle-journal or CAMPAIGNS_OS_LIFECYCLE_LOG. This invocation takes no --packet, so an ambient run session opened at a target repo is not its session and its journal is not selected",
|
|
2761
|
+
"observed_in": [
|
|
2762
|
+
"lifecycle_log"
|
|
2763
|
+
]
|
|
2764
|
+
}
|
|
2765
|
+
],
|
|
2766
|
+
"sends": [
|
|
2767
|
+
{
|
|
2768
|
+
"destination": "{base-url}",
|
|
2769
|
+
"what": "browser navigation and typed-card order traversal of the scenario's checkout and upsell routes against the candidate campaign — real orders through the deployed checkout",
|
|
2770
|
+
"when": "a Chromium is installed and the scenario's routes resolve; the base URL is --base-url, else the fixture's candidate_base_url",
|
|
2771
|
+
"requires_consent": false,
|
|
2772
|
+
"observed_in": [],
|
|
2773
|
+
"not_observed_reason": "no browser is installed in the fixture's pinned Playwright registry, so the capture is refused before the first navigation and the loopback stand-in for --base-url is never contacted"
|
|
2774
|
+
}
|
|
2775
|
+
],
|
|
2776
|
+
"effect_test": "effects: qa parity --no-post-verdict (preflight)",
|
|
2777
|
+
"test_scope": "preflight",
|
|
2778
|
+
"notes": "PREFLIGHT-PROVED: fixture-driven migration parity. The capture needs an installed Chromium and a reachable candidate funnel, neither of which exists offline; the effect fixture pins PLAYWRIGHT_BROWSERS_PATH at an empty registry inside the target so that is a fact of the fixture rather than of the machine. The case proves the refusal writes nothing but the lifecycle entry and contacts the loopback stand-in for --base-url zero times. Reads the fixture and (with --parity-order-json) a saved capture bundle; writes NOTHING under the packet or the target repo — `qa parity` takes no packet, projects no verdict sidecar and stamps no assembly report, which is what separates it from every `qa run` form. --no-post-verdict (--local-only) drops the verdict POST only: the evidence bundle and the verdict are still written locally, and the capture still drives the campaign under test, so the row stays tier A. `qa publish` posts the stored verdict later without a re-run.",
|
|
2779
|
+
"preflight": {
|
|
2780
|
+
"may_write": [
|
|
2781
|
+
"{lifecycle-journal}"
|
|
2782
|
+
],
|
|
2783
|
+
"may_contact": []
|
|
2784
|
+
}
|
|
2785
|
+
},
|
|
2786
|
+
{
|
|
2787
|
+
"command": "qa",
|
|
2788
|
+
"subcommand": "waive",
|
|
2789
|
+
"flags": [],
|
|
2790
|
+
"annotations": {
|
|
2791
|
+
"readOnlyHint": false,
|
|
2792
|
+
"destructiveHint": true,
|
|
2793
|
+
"openWorldHint": false,
|
|
2794
|
+
"idempotentHint": true
|
|
2795
|
+
},
|
|
2796
|
+
"tier": "C",
|
|
2797
|
+
"writes": [
|
|
2798
|
+
{
|
|
2799
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
2800
|
+
"when": "always — the waiver is recorded at stages.qa.waivers[<assertion>] (reason, waived_by, waived_at) and appended to the report's evidence[]",
|
|
2801
|
+
"observed_in": [
|
|
2802
|
+
"no_session",
|
|
2803
|
+
"ambient_session",
|
|
2804
|
+
"stale_session",
|
|
2805
|
+
"lifecycle_log",
|
|
2806
|
+
"persisted_consent"
|
|
2807
|
+
]
|
|
2808
|
+
},
|
|
2809
|
+
{
|
|
2810
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
2811
|
+
"when": "the waiver invalidates the retained doctor sidecar — the report edit postdates the doctor snapshot",
|
|
2812
|
+
"observed_in": [
|
|
2813
|
+
"no_session",
|
|
2814
|
+
"ambient_session",
|
|
2815
|
+
"stale_session",
|
|
2816
|
+
"lifecycle_log",
|
|
2817
|
+
"persisted_consent"
|
|
2818
|
+
]
|
|
2819
|
+
},
|
|
2820
|
+
{
|
|
2821
|
+
"path": "{lifecycle-journal}",
|
|
2822
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
2823
|
+
"observed_in": [
|
|
2824
|
+
"ambient_session",
|
|
2825
|
+
"lifecycle_log"
|
|
2826
|
+
]
|
|
2827
|
+
}
|
|
2828
|
+
],
|
|
2829
|
+
"sends": [],
|
|
2830
|
+
"effect_test": "effects: qa waive",
|
|
2831
|
+
"test_scope": "full",
|
|
2832
|
+
"notes": "Destructive for the same reason as `theme waive` and `checkpoint waive`: the waiver changes what the next `qa run` concludes — a FAILING blocker is downgraded to a warning with this attribution and the disposition becomes ready_with_exceptions, never plain ready — so the state a later doctor reads is not the state it measured. The lane is scoped to exactly one assertion, analytics-correctness:purchase-fires; any other --assertion is refused. --reason is required and is recorded verbatim; --waived-by defaults to $USER@local. The report is the packet target repo's unless --report names another."
|
|
2833
|
+
},
|
|
2834
|
+
{
|
|
2835
|
+
"command": "qa",
|
|
2836
|
+
"subcommand": "install-browser",
|
|
2837
|
+
"flags": [],
|
|
2838
|
+
"annotations": {
|
|
2839
|
+
"readOnlyHint": false,
|
|
2840
|
+
"destructiveHint": false,
|
|
2841
|
+
"openWorldHint": true,
|
|
2842
|
+
"idempotentHint": true
|
|
2843
|
+
},
|
|
2844
|
+
"tier": "A",
|
|
2845
|
+
"writes": [
|
|
2846
|
+
{
|
|
2847
|
+
"path": "{home}/ms-playwright/.links/*",
|
|
2848
|
+
"when": "always — Playwright records this package's installation in the browser registry as one link entry, named for the installing package's path, before it looks at what is already downloaded",
|
|
2849
|
+
"observed_in": [
|
|
2850
|
+
"no_session",
|
|
2851
|
+
"ambient_session",
|
|
2852
|
+
"stale_session",
|
|
2853
|
+
"lifecycle_log",
|
|
2854
|
+
"persisted_consent"
|
|
2855
|
+
]
|
|
2856
|
+
},
|
|
2857
|
+
{
|
|
2858
|
+
"path": "{home}/ms-playwright/**",
|
|
2859
|
+
"when": "the download completes — the Chromium build (a ~150 MB archive) is unpacked into a revision directory of the same registry",
|
|
2860
|
+
"observed_in": [],
|
|
2861
|
+
"not_observed_reason": "the effect fixture pins PLAYWRIGHT_DOWNLOAD_HOST at a closed loopback port, so the archive is never fetched and no browser directory is created"
|
|
2862
|
+
},
|
|
2863
|
+
{
|
|
2864
|
+
"path": "{lifecycle-journal}",
|
|
2865
|
+
"when": "a lifecycle journal is selected for the invocation — --lifecycle-journal or CAMPAIGNS_OS_LIFECYCLE_LOG. This invocation takes no --packet, so an ambient run session opened at a target repo is not its session and its journal is not selected",
|
|
2866
|
+
"observed_in": [
|
|
2867
|
+
"lifecycle_log"
|
|
2868
|
+
]
|
|
2869
|
+
}
|
|
2870
|
+
],
|
|
2871
|
+
"sends": [
|
|
2872
|
+
{
|
|
2873
|
+
"destination": "{playwright-download-host}",
|
|
2874
|
+
"what": "a GET of the Chromium build archive (~150 MB) and of the headless shell beside it",
|
|
2875
|
+
"when": "the registry does not already hold the revision this package's Playwright pins",
|
|
2876
|
+
"requires_consent": false,
|
|
2877
|
+
"observed_in": [],
|
|
2878
|
+
"not_observed_reason": "the effect fixture pins PLAYWRIGHT_DOWNLOAD_HOST at a closed loopback port, so the fetch fails at connect; the NODE_DEBUG=net trace the case asserts on names no host but 127.0.0.1"
|
|
2879
|
+
}
|
|
2880
|
+
],
|
|
2881
|
+
"effect_test": "effects: qa install-browser (preflight)",
|
|
2882
|
+
"test_scope": "preflight",
|
|
2883
|
+
"notes": "PREFLIGHT-PROVED: the one-time browser install cannot complete with no network — it downloads the Chromium build from the Playwright CDN. This is the only row in this file whose send is not a Campaigns OS endpoint, and the only one that writes the user's machine outside the config root. The case proves the failed install writes exactly one path there — the registry's link entry — and nothing else anywhere, and that the download attempt leaves the machine zero times. The registry is PLAYWRIGHT_BROWSERS_PATH when set, else the platform browser cache under the home directory (~/Library/Caches/ms-playwright on macOS, ~/.cache/ms-playwright on Linux, %LOCALAPPDATA%\\ms-playwright on Windows); the fixture pins it to {home}/ms-playwright so the proved path is the same on every platform. Not destructive: an already-installed revision is left alone, which is also why the run is idempotent. Runs the Playwright CLI bundled with THIS package, never whatever `npx playwright` resolves to.",
|
|
2884
|
+
"preflight": {
|
|
2885
|
+
"may_write": [
|
|
2886
|
+
"{home}/ms-playwright/.links/*",
|
|
2887
|
+
"{lifecycle-journal}"
|
|
2888
|
+
],
|
|
2889
|
+
"may_contact": []
|
|
2890
|
+
}
|
|
2891
|
+
},
|
|
2892
|
+
{
|
|
2893
|
+
"command": "run-record",
|
|
2894
|
+
"subcommand": null,
|
|
2895
|
+
"flags": [],
|
|
2896
|
+
"annotations": {
|
|
2897
|
+
"readOnlyHint": false,
|
|
2898
|
+
"destructiveHint": false,
|
|
2899
|
+
"openWorldHint": true,
|
|
2900
|
+
"idempotentHint": true
|
|
2901
|
+
},
|
|
2902
|
+
"tier": "A",
|
|
2903
|
+
"writes": [
|
|
2904
|
+
{
|
|
2905
|
+
"path": "{cwd}/.campaign-runtime/run-records/*.json",
|
|
2906
|
+
"when": "always — the assembled Run Record is written (re-emitted in place for an existing run id)",
|
|
2907
|
+
"observed_in": [
|
|
2908
|
+
"no_session",
|
|
2909
|
+
"ambient_session",
|
|
2910
|
+
"stale_session",
|
|
2911
|
+
"lifecycle_log",
|
|
2912
|
+
"persisted_consent"
|
|
2913
|
+
]
|
|
2914
|
+
},
|
|
2915
|
+
{
|
|
2916
|
+
"path": "{lifecycle-journal}",
|
|
2917
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
2918
|
+
"observed_in": [
|
|
2919
|
+
"ambient_session",
|
|
2920
|
+
"lifecycle_log"
|
|
2921
|
+
]
|
|
2922
|
+
}
|
|
2923
|
+
],
|
|
2924
|
+
"sends": [
|
|
2925
|
+
{
|
|
2926
|
+
"destination": "{proxy-base}/api/runs",
|
|
2927
|
+
"what": "the Run Record / progress remit envelope for this run",
|
|
2928
|
+
"when": "Run Telemetry consent is on for the endpoint and --no-remit was not given",
|
|
2929
|
+
"requires_consent": true,
|
|
2930
|
+
"observed_in": [
|
|
2931
|
+
"no_session",
|
|
2932
|
+
"ambient_session",
|
|
2933
|
+
"stale_session",
|
|
2934
|
+
"lifecycle_log",
|
|
2935
|
+
"persisted_consent"
|
|
2936
|
+
]
|
|
2937
|
+
}
|
|
2938
|
+
],
|
|
2939
|
+
"effect_test": "effects: run-record",
|
|
2940
|
+
"test_scope": "full",
|
|
2941
|
+
"notes": "Capture is always local; the remit is what consent gates. The record lands beside the working directory's runtime tree, not the target repo's."
|
|
2942
|
+
},
|
|
2943
|
+
{
|
|
2944
|
+
"command": "run-record",
|
|
2945
|
+
"subcommand": null,
|
|
2946
|
+
"flags": [
|
|
2947
|
+
"--no-remit"
|
|
2948
|
+
],
|
|
2949
|
+
"annotations": {
|
|
2950
|
+
"readOnlyHint": false,
|
|
2951
|
+
"destructiveHint": false,
|
|
2952
|
+
"openWorldHint": false,
|
|
2953
|
+
"idempotentHint": true
|
|
2954
|
+
},
|
|
2955
|
+
"tier": "B",
|
|
2956
|
+
"writes": [
|
|
2957
|
+
{
|
|
2958
|
+
"path": "{cwd}/.campaign-runtime/run-records/*.json",
|
|
2959
|
+
"when": "always — the assembled Run Record is written",
|
|
2960
|
+
"observed_in": [
|
|
2961
|
+
"no_session",
|
|
2962
|
+
"ambient_session",
|
|
2963
|
+
"stale_session",
|
|
2964
|
+
"lifecycle_log",
|
|
2965
|
+
"persisted_consent"
|
|
2966
|
+
]
|
|
2967
|
+
},
|
|
2968
|
+
{
|
|
2969
|
+
"path": "{lifecycle-journal}",
|
|
2970
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
2971
|
+
"observed_in": [
|
|
2972
|
+
"ambient_session",
|
|
2973
|
+
"lifecycle_log"
|
|
2974
|
+
]
|
|
2975
|
+
}
|
|
2976
|
+
],
|
|
2977
|
+
"sends": [],
|
|
2978
|
+
"effect_test": "effects: run-record --no-remit",
|
|
2979
|
+
"test_scope": "full",
|
|
2980
|
+
"notes": "--no-remit drops the send for this run and leaves the local capture untouched."
|
|
2981
|
+
},
|
|
2982
|
+
{
|
|
2983
|
+
"command": "run",
|
|
2984
|
+
"subcommand": "start",
|
|
2985
|
+
"flags": [],
|
|
2986
|
+
"annotations": {
|
|
2987
|
+
"readOnlyHint": false,
|
|
2988
|
+
"destructiveHint": false,
|
|
2989
|
+
"openWorldHint": true,
|
|
2990
|
+
"idempotentHint": false
|
|
2991
|
+
},
|
|
2992
|
+
"tier": "A",
|
|
2993
|
+
"writes": [
|
|
2994
|
+
{
|
|
2995
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
2996
|
+
"when": "no session is active at the root — the ambient session file is created",
|
|
2997
|
+
"observed_in": [
|
|
2998
|
+
"no_session",
|
|
2999
|
+
"stale_session",
|
|
3000
|
+
"lifecycle_log",
|
|
3001
|
+
"persisted_consent"
|
|
3002
|
+
]
|
|
3003
|
+
},
|
|
3004
|
+
{
|
|
3005
|
+
"path": "{target}/.gitignore",
|
|
3006
|
+
"when": "the target does not already ignore the runtime directory",
|
|
3007
|
+
"observed_in": [
|
|
3008
|
+
"no_session",
|
|
3009
|
+
"stale_session",
|
|
3010
|
+
"lifecycle_log",
|
|
3011
|
+
"persisted_consent"
|
|
3012
|
+
]
|
|
3013
|
+
},
|
|
3014
|
+
{
|
|
3015
|
+
"path": "{cwd}/.campaign-runtime/run-records/*.json",
|
|
3016
|
+
"when": "a STALE run session at the root the command is about to act on is closed out before argv is read",
|
|
3017
|
+
"observed_in": [
|
|
3018
|
+
"stale_session"
|
|
3019
|
+
]
|
|
3020
|
+
},
|
|
3021
|
+
{
|
|
3022
|
+
"path": "{lifecycle-journal}",
|
|
3023
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
3024
|
+
"observed_in": [
|
|
3025
|
+
"ambient_session",
|
|
3026
|
+
"lifecycle_log"
|
|
3027
|
+
]
|
|
3028
|
+
}
|
|
3029
|
+
],
|
|
3030
|
+
"sends": [
|
|
3031
|
+
{
|
|
3032
|
+
"destination": "{proxy-base}/api/runs",
|
|
3033
|
+
"what": "the Run Record / progress remit envelope for this run",
|
|
3034
|
+
"when": "Run Telemetry consent is on for the endpoint and --no-remit was not given",
|
|
3035
|
+
"requires_consent": true,
|
|
3036
|
+
"observed_in": [],
|
|
3037
|
+
"not_observed_reason": "the stale closeout remits under consent, but this invocation takes no --proxy-base to point at a loopback stand-in, so it is never run consented at an endpoint the test can watch (the persisted grant is scoped to the loopback, so a canonical remit resolves OFF and sends nothing). The closeout is proved under stale_session by the local Run Record it writes"
|
|
3038
|
+
}
|
|
3039
|
+
],
|
|
3040
|
+
"effect_test": "effects: run start",
|
|
3041
|
+
"test_scope": "full",
|
|
3042
|
+
"notes": "Opening a session is not idempotent: a second `run start` with a session already active is refused (exit 1). A STALE session at the root is closed out first — Run Record assembled and remitted under the usual consent — which is a declared effect of this command even when argv is then refused."
|
|
3043
|
+
},
|
|
3044
|
+
{
|
|
3045
|
+
"command": "run",
|
|
3046
|
+
"subcommand": "start",
|
|
3047
|
+
"flags": [
|
|
3048
|
+
"--force"
|
|
3049
|
+
],
|
|
3050
|
+
"annotations": {
|
|
3051
|
+
"readOnlyHint": false,
|
|
3052
|
+
"destructiveHint": true,
|
|
3053
|
+
"openWorldHint": true,
|
|
3054
|
+
"idempotentHint": false
|
|
3055
|
+
},
|
|
3056
|
+
"tier": "C",
|
|
3057
|
+
"writes": [
|
|
3058
|
+
{
|
|
3059
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
3060
|
+
"when": "always — the ambient session file is written, over an ACTIVE session's file too (which is what the base form refuses to do)",
|
|
3061
|
+
"observed_in": [
|
|
3062
|
+
"no_session",
|
|
3063
|
+
"ambient_session",
|
|
3064
|
+
"stale_session",
|
|
3065
|
+
"lifecycle_log",
|
|
3066
|
+
"persisted_consent"
|
|
3067
|
+
]
|
|
3068
|
+
},
|
|
3069
|
+
{
|
|
3070
|
+
"path": "{target}/.gitignore",
|
|
3071
|
+
"when": "the target does not already ignore the runtime directory",
|
|
3072
|
+
"observed_in": [
|
|
3073
|
+
"no_session",
|
|
3074
|
+
"stale_session",
|
|
3075
|
+
"lifecycle_log",
|
|
3076
|
+
"persisted_consent"
|
|
3077
|
+
]
|
|
3078
|
+
},
|
|
3079
|
+
{
|
|
3080
|
+
"path": "{cwd}/.campaign-runtime/run-records/*.json",
|
|
3081
|
+
"when": "a STALE run session at the root the command is about to act on is closed out before argv is read",
|
|
3082
|
+
"observed_in": [
|
|
3083
|
+
"stale_session"
|
|
3084
|
+
]
|
|
3085
|
+
},
|
|
3086
|
+
{
|
|
3087
|
+
"path": "{lifecycle-journal}",
|
|
3088
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
3089
|
+
"observed_in": [
|
|
3090
|
+
"ambient_session",
|
|
3091
|
+
"lifecycle_log"
|
|
3092
|
+
]
|
|
3093
|
+
}
|
|
3094
|
+
],
|
|
3095
|
+
"sends": [
|
|
3096
|
+
{
|
|
3097
|
+
"destination": "{proxy-base}/api/runs",
|
|
3098
|
+
"what": "the Run Record / progress remit envelope for this run",
|
|
3099
|
+
"when": "Run Telemetry consent is on for the endpoint and --no-remit was not given",
|
|
3100
|
+
"requires_consent": true,
|
|
3101
|
+
"observed_in": [],
|
|
3102
|
+
"not_observed_reason": "the stale closeout remits under consent, but this invocation takes no --proxy-base to point at a loopback stand-in, so it is never run consented at an endpoint the test can watch (the persisted grant is scoped to the loopback, so a canonical remit resolves OFF and sends nothing). The closeout is proved under stale_session by the local Run Record it writes"
|
|
3103
|
+
}
|
|
3104
|
+
],
|
|
3105
|
+
"effect_test": "effects: run start --force",
|
|
3106
|
+
"test_scope": "full",
|
|
3107
|
+
"notes": "DESTRUCTIVE: --force opens a new session over one that is already active at the root, discarding the session file that was there (the run it identified is no longer the ambient run). The base form refuses instead. The stale-session closeout is the base form's."
|
|
3108
|
+
},
|
|
3109
|
+
{
|
|
3110
|
+
"command": "run",
|
|
3111
|
+
"subcommand": "end",
|
|
3112
|
+
"flags": [],
|
|
3113
|
+
"annotations": {
|
|
3114
|
+
"readOnlyHint": false,
|
|
3115
|
+
"destructiveHint": true,
|
|
3116
|
+
"openWorldHint": true,
|
|
3117
|
+
"idempotentHint": false
|
|
3118
|
+
},
|
|
3119
|
+
"tier": "C",
|
|
3120
|
+
"writes": [
|
|
3121
|
+
{
|
|
3122
|
+
"path": "{cwd}/.campaign-runtime/run-records/*.json",
|
|
3123
|
+
"when": "a session is active (or stale) at the root — the aggregated Run Record is written",
|
|
3124
|
+
"observed_in": [
|
|
3125
|
+
"ambient_session",
|
|
3126
|
+
"stale_session"
|
|
3127
|
+
]
|
|
3128
|
+
},
|
|
3129
|
+
{
|
|
3130
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
3131
|
+
"when": "always on a successful close — the session file is REMOVED",
|
|
3132
|
+
"observed_in": [
|
|
3133
|
+
"ambient_session",
|
|
3134
|
+
"stale_session"
|
|
3135
|
+
]
|
|
3136
|
+
},
|
|
3137
|
+
{
|
|
3138
|
+
"path": "{lifecycle-journal}",
|
|
3139
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
3140
|
+
"observed_in": [
|
|
3141
|
+
"ambient_session",
|
|
3142
|
+
"lifecycle_log"
|
|
3143
|
+
]
|
|
3144
|
+
}
|
|
3145
|
+
],
|
|
3146
|
+
"sends": [
|
|
3147
|
+
{
|
|
3148
|
+
"destination": "{proxy-base}/api/runs",
|
|
3149
|
+
"what": "the Run Record / progress remit envelope for this run",
|
|
3150
|
+
"when": "Run Telemetry consent is on for the endpoint and --no-remit was not given",
|
|
3151
|
+
"requires_consent": true,
|
|
3152
|
+
"observed_in": [
|
|
3153
|
+
"ambient_session",
|
|
3154
|
+
"stale_session"
|
|
3155
|
+
]
|
|
3156
|
+
}
|
|
3157
|
+
],
|
|
3158
|
+
"effect_test": "effects: run end",
|
|
3159
|
+
"test_scope": "full",
|
|
3160
|
+
"notes": "Destructive: the close CLEARS the session. With no session at the root it refuses (exit 1) and writes only the lifecycle entry."
|
|
3161
|
+
},
|
|
3162
|
+
{
|
|
3163
|
+
"command": "run",
|
|
3164
|
+
"subcommand": "end",
|
|
3165
|
+
"flags": [
|
|
3166
|
+
"--dry-run"
|
|
3167
|
+
],
|
|
3168
|
+
"annotations": {
|
|
3169
|
+
"readOnlyHint": true,
|
|
3170
|
+
"destructiveHint": false,
|
|
3171
|
+
"openWorldHint": false,
|
|
3172
|
+
"idempotentHint": true
|
|
3173
|
+
},
|
|
3174
|
+
"tier": "none",
|
|
3175
|
+
"writes": [],
|
|
3176
|
+
"sends": [],
|
|
3177
|
+
"effect_test": "effects: run end --dry-run",
|
|
3178
|
+
"test_scope": "full",
|
|
3179
|
+
"notes": "--dry-run is handed on to run-record: the aggregated record is assembled and printed, and nothing is written or sent. The run session is LEFT OPEN, so the close can still be made for real afterwards, and the pre-dispatch stale sweep is skipped for the same reason."
|
|
3180
|
+
},
|
|
3181
|
+
{
|
|
3182
|
+
"command": "run",
|
|
3183
|
+
"subcommand": "end",
|
|
3184
|
+
"flags": [
|
|
3185
|
+
"--no-write"
|
|
3186
|
+
],
|
|
3187
|
+
"annotations": {
|
|
3188
|
+
"readOnlyHint": false,
|
|
3189
|
+
"destructiveHint": true,
|
|
3190
|
+
"openWorldHint": false,
|
|
3191
|
+
"idempotentHint": false
|
|
3192
|
+
},
|
|
3193
|
+
"tier": "C",
|
|
3194
|
+
"writes": [
|
|
3195
|
+
{
|
|
3196
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
3197
|
+
"when": "a session is active at the root — the close still CLEARS the session file",
|
|
3198
|
+
"observed_in": [
|
|
3199
|
+
"ambient_session"
|
|
3200
|
+
]
|
|
3201
|
+
}
|
|
3202
|
+
],
|
|
3203
|
+
"sends": [],
|
|
3204
|
+
"effect_test": "effects: run end --no-write",
|
|
3205
|
+
"test_scope": "full",
|
|
3206
|
+
"notes": "DESTRUCTIVE, and not what the flag reads like: --no-write suppresses the Run Record, the remit and the lifecycle entry, but the close still CLEARS the active session file — the one byte-visible effect the flag does not suppress. (The pre-dispatch stale sweep IS skipped, so an aged session at a root this invocation is not closing stays put.) The row states what the code does; the help text's \"leaves the target byte-identical\" is about the suppressed closeout, not about the session this command is asked to end."
|
|
3207
|
+
},
|
|
3208
|
+
{
|
|
3209
|
+
"command": "run",
|
|
3210
|
+
"subcommand": "end",
|
|
3211
|
+
"flags": [
|
|
3212
|
+
"--no-remit"
|
|
3213
|
+
],
|
|
3214
|
+
"annotations": {
|
|
3215
|
+
"readOnlyHint": false,
|
|
3216
|
+
"destructiveHint": true,
|
|
3217
|
+
"openWorldHint": false,
|
|
3218
|
+
"idempotentHint": false
|
|
3219
|
+
},
|
|
3220
|
+
"tier": "C",
|
|
3221
|
+
"writes": [
|
|
3222
|
+
{
|
|
3223
|
+
"path": "{cwd}/.campaign-runtime/run-records/*.json",
|
|
3224
|
+
"when": "a session is active (or stale) at the root — the aggregated Run Record is written",
|
|
3225
|
+
"observed_in": [
|
|
3226
|
+
"ambient_session",
|
|
3227
|
+
"stale_session"
|
|
3228
|
+
]
|
|
3229
|
+
},
|
|
3230
|
+
{
|
|
3231
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
3232
|
+
"when": "always on a successful close — the session file is REMOVED",
|
|
3233
|
+
"observed_in": [
|
|
3234
|
+
"ambient_session",
|
|
3235
|
+
"stale_session"
|
|
3236
|
+
]
|
|
3237
|
+
},
|
|
3238
|
+
{
|
|
3239
|
+
"path": "{lifecycle-journal}",
|
|
3240
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
3241
|
+
"observed_in": [
|
|
3242
|
+
"ambient_session",
|
|
3243
|
+
"lifecycle_log"
|
|
3244
|
+
]
|
|
3245
|
+
}
|
|
3246
|
+
],
|
|
3247
|
+
"sends": [],
|
|
3248
|
+
"effect_test": "effects: run end --no-remit",
|
|
3249
|
+
"test_scope": "full",
|
|
3250
|
+
"notes": "Destructive: the close still CLEARS the session and writes the aggregated Run Record — --no-remit only stops the record leaving the machine. The flag is handed on to run-record, and the stale closeout at cwd inherits it too."
|
|
3251
|
+
},
|
|
3252
|
+
{
|
|
3253
|
+
"command": "telemetry",
|
|
3254
|
+
"subcommand": "list",
|
|
3255
|
+
"flags": [],
|
|
3256
|
+
"annotations": {
|
|
3257
|
+
"readOnlyHint": false,
|
|
3258
|
+
"destructiveHint": false,
|
|
3259
|
+
"openWorldHint": true,
|
|
3260
|
+
"idempotentHint": true
|
|
3261
|
+
},
|
|
3262
|
+
"tier": "A",
|
|
3263
|
+
"writes": [
|
|
3264
|
+
{
|
|
3265
|
+
"path": "{lifecycle-journal}",
|
|
3266
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
3267
|
+
"observed_in": [
|
|
3268
|
+
"ambient_session",
|
|
3269
|
+
"lifecycle_log"
|
|
3270
|
+
]
|
|
3271
|
+
}
|
|
3272
|
+
],
|
|
3273
|
+
"sends": [
|
|
3274
|
+
{
|
|
3275
|
+
"destination": "{proxy-base}/api/runs",
|
|
3276
|
+
"what": "a read of the stored Run Records under the tenant or ops-admin credential",
|
|
3277
|
+
"when": "always",
|
|
3278
|
+
"requires_consent": false,
|
|
3279
|
+
"observed_in": [
|
|
3280
|
+
"no_session",
|
|
3281
|
+
"ambient_session",
|
|
3282
|
+
"stale_session",
|
|
3283
|
+
"lifecycle_log",
|
|
3284
|
+
"persisted_consent"
|
|
3285
|
+
]
|
|
3286
|
+
}
|
|
3287
|
+
],
|
|
3288
|
+
"effect_test": "effects: telemetry list (preflight)",
|
|
3289
|
+
"test_scope": "preflight",
|
|
3290
|
+
"notes": "PREFLIGHT-PROVED: the cross-tenant listing needs a real ops admin key and a real endpoint, so the listing itself cannot be exercised offline. The case proves the declared destination IS the one contacted (the loopback receiver sees GET /api/runs) and that the refusal that follows writes nothing but the lifecycle entry.",
|
|
3291
|
+
"preflight": {
|
|
3292
|
+
"may_write": [
|
|
3293
|
+
"{lifecycle-journal}"
|
|
3294
|
+
],
|
|
3295
|
+
"may_contact": [
|
|
3296
|
+
"/api/runs"
|
|
3297
|
+
]
|
|
3298
|
+
}
|
|
3299
|
+
},
|
|
3300
|
+
{
|
|
3301
|
+
"command": "checkpoint",
|
|
3302
|
+
"subcommand": "waive",
|
|
3303
|
+
"flags": [],
|
|
3304
|
+
"annotations": {
|
|
3305
|
+
"readOnlyHint": false,
|
|
3306
|
+
"destructiveHint": true,
|
|
3307
|
+
"openWorldHint": false,
|
|
3308
|
+
"idempotentHint": true
|
|
3309
|
+
},
|
|
3310
|
+
"tier": "C",
|
|
3311
|
+
"writes": [
|
|
3312
|
+
{
|
|
3313
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
3314
|
+
"when": "always — the waiver is recorded on the report",
|
|
3315
|
+
"observed_in": [
|
|
3316
|
+
"no_session",
|
|
3317
|
+
"ambient_session",
|
|
3318
|
+
"stale_session",
|
|
3319
|
+
"lifecycle_log",
|
|
3320
|
+
"persisted_consent"
|
|
3321
|
+
]
|
|
3322
|
+
},
|
|
3323
|
+
{
|
|
3324
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
3325
|
+
"when": "the waiver invalidates the retained doctor sidecar",
|
|
3326
|
+
"observed_in": [
|
|
3327
|
+
"no_session",
|
|
3328
|
+
"ambient_session",
|
|
3329
|
+
"stale_session",
|
|
3330
|
+
"lifecycle_log",
|
|
3331
|
+
"persisted_consent"
|
|
3332
|
+
]
|
|
3333
|
+
},
|
|
3334
|
+
{
|
|
3335
|
+
"path": "{lifecycle-journal}",
|
|
3336
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
3337
|
+
"observed_in": [
|
|
3338
|
+
"ambient_session",
|
|
3339
|
+
"lifecycle_log"
|
|
3340
|
+
]
|
|
3341
|
+
}
|
|
3342
|
+
],
|
|
3343
|
+
"sends": [],
|
|
3344
|
+
"effect_test": "effects: checkpoint waive",
|
|
3345
|
+
"test_scope": "full",
|
|
3346
|
+
"notes": "Destructive: a waiver overrides a blocking gate, so the state a later doctor reads is not the state it measured. One bound (an expiry or a review condition) and a named human are required."
|
|
3347
|
+
},
|
|
3348
|
+
{
|
|
3349
|
+
"command": "theme",
|
|
3350
|
+
"subcommand": "waive",
|
|
3351
|
+
"flags": [],
|
|
3352
|
+
"annotations": {
|
|
3353
|
+
"readOnlyHint": false,
|
|
3354
|
+
"destructiveHint": true,
|
|
3355
|
+
"openWorldHint": false,
|
|
3356
|
+
"idempotentHint": true
|
|
3357
|
+
},
|
|
3358
|
+
"tier": "C",
|
|
3359
|
+
"writes": [
|
|
3360
|
+
{
|
|
3361
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
3362
|
+
"when": "always — the theme-gate waiver is recorded on the report",
|
|
3363
|
+
"observed_in": [
|
|
3364
|
+
"no_session",
|
|
3365
|
+
"ambient_session",
|
|
3366
|
+
"stale_session",
|
|
3367
|
+
"lifecycle_log",
|
|
3368
|
+
"persisted_consent"
|
|
3369
|
+
]
|
|
3370
|
+
},
|
|
3371
|
+
{
|
|
3372
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
3373
|
+
"when": "the waiver invalidates the retained doctor sidecar",
|
|
3374
|
+
"observed_in": [
|
|
3375
|
+
"no_session",
|
|
3376
|
+
"ambient_session",
|
|
3377
|
+
"stale_session",
|
|
3378
|
+
"lifecycle_log",
|
|
3379
|
+
"persisted_consent"
|
|
3380
|
+
]
|
|
3381
|
+
},
|
|
3382
|
+
{
|
|
3383
|
+
"path": "{lifecycle-journal}",
|
|
3384
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
3385
|
+
"observed_in": [
|
|
3386
|
+
"ambient_session",
|
|
3387
|
+
"lifecycle_log"
|
|
3388
|
+
]
|
|
3389
|
+
}
|
|
3390
|
+
],
|
|
3391
|
+
"sends": [],
|
|
3392
|
+
"effect_test": "effects: theme waive",
|
|
3393
|
+
"test_scope": "full",
|
|
3394
|
+
"notes": "Destructive for the same reason as `checkpoint waive`: the brand-layer gate stops blocking. Placeholders such as \"operator\" are refused for --waived-by."
|
|
3395
|
+
},
|
|
3396
|
+
{
|
|
3397
|
+
"command": "start",
|
|
3398
|
+
"subcommand": null,
|
|
3399
|
+
"flags": [],
|
|
3400
|
+
"annotations": {
|
|
3401
|
+
"readOnlyHint": false,
|
|
3402
|
+
"destructiveHint": false,
|
|
3403
|
+
"openWorldHint": true,
|
|
3404
|
+
"idempotentHint": false
|
|
3405
|
+
},
|
|
3406
|
+
"tier": "A",
|
|
3407
|
+
"writes": [
|
|
3408
|
+
{
|
|
3409
|
+
"path": "{target}/campaign-runtime.build.json",
|
|
3410
|
+
"when": "always — the Build Packet is written into the target",
|
|
3411
|
+
"observed_in": [
|
|
3412
|
+
"no_session",
|
|
3413
|
+
"ambient_session",
|
|
3414
|
+
"stale_session",
|
|
3415
|
+
"lifecycle_log",
|
|
3416
|
+
"persisted_consent"
|
|
3417
|
+
]
|
|
3418
|
+
},
|
|
3419
|
+
{
|
|
3420
|
+
"path": "{target}/.campaign-runtime/build-context.json",
|
|
3421
|
+
"when": "always — the build context sidecar",
|
|
3422
|
+
"observed_in": [
|
|
3423
|
+
"no_session",
|
|
3424
|
+
"ambient_session",
|
|
3425
|
+
"stale_session",
|
|
3426
|
+
"lifecycle_log",
|
|
3427
|
+
"persisted_consent"
|
|
3428
|
+
]
|
|
3429
|
+
},
|
|
3430
|
+
{
|
|
3431
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
3432
|
+
"when": "always — the assembly report for the run",
|
|
3433
|
+
"observed_in": [
|
|
3434
|
+
"no_session",
|
|
3435
|
+
"ambient_session",
|
|
3436
|
+
"stale_session",
|
|
3437
|
+
"lifecycle_log",
|
|
3438
|
+
"persisted_consent"
|
|
3439
|
+
]
|
|
3440
|
+
},
|
|
3441
|
+
{
|
|
3442
|
+
"path": "{target}/.campaign-runtime/input/*",
|
|
3443
|
+
"when": "always — the normalized brief and the design source package",
|
|
3444
|
+
"observed_in": [
|
|
3445
|
+
"no_session",
|
|
3446
|
+
"ambient_session",
|
|
3447
|
+
"stale_session",
|
|
3448
|
+
"lifecycle_log",
|
|
3449
|
+
"persisted_consent"
|
|
3450
|
+
]
|
|
3451
|
+
},
|
|
3452
|
+
{
|
|
3453
|
+
"path": "{target}/.campaign-runtime/theme/theme-report.json",
|
|
3454
|
+
"when": "the theme policy is not off",
|
|
3455
|
+
"observed_in": [
|
|
3456
|
+
"no_session",
|
|
3457
|
+
"ambient_session",
|
|
3458
|
+
"stale_session",
|
|
3459
|
+
"lifecycle_log",
|
|
3460
|
+
"persisted_consent"
|
|
3461
|
+
]
|
|
3462
|
+
},
|
|
3463
|
+
{
|
|
3464
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
3465
|
+
"when": "the intake runs doctor — `start` and `build` do, `prepare-build` alone does not",
|
|
3466
|
+
"observed_in": [
|
|
3467
|
+
"no_session",
|
|
3468
|
+
"ambient_session",
|
|
3469
|
+
"stale_session",
|
|
3470
|
+
"lifecycle_log",
|
|
3471
|
+
"persisted_consent"
|
|
3472
|
+
]
|
|
3473
|
+
},
|
|
3474
|
+
{
|
|
3475
|
+
"path": "{target}/.campaign-runtime/agent-context/*",
|
|
3476
|
+
"when": "always for `start` — the agent context files are installed into the target",
|
|
3477
|
+
"observed_in": [
|
|
3478
|
+
"no_session",
|
|
3479
|
+
"ambient_session",
|
|
3480
|
+
"stale_session",
|
|
3481
|
+
"lifecycle_log",
|
|
3482
|
+
"persisted_consent"
|
|
3483
|
+
]
|
|
3484
|
+
},
|
|
3485
|
+
{
|
|
3486
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
3487
|
+
"when": "the ambient run session is auto-opened (suppressed by --no-run-session)",
|
|
3488
|
+
"observed_in": [
|
|
3489
|
+
"no_session",
|
|
3490
|
+
"stale_session",
|
|
3491
|
+
"lifecycle_log",
|
|
3492
|
+
"persisted_consent"
|
|
3493
|
+
]
|
|
3494
|
+
},
|
|
3495
|
+
{
|
|
3496
|
+
"path": "{target}/.gitignore",
|
|
3497
|
+
"when": "the target does not already ignore the runtime directory",
|
|
3498
|
+
"observed_in": [
|
|
3499
|
+
"no_session",
|
|
3500
|
+
"stale_session",
|
|
3501
|
+
"lifecycle_log",
|
|
3502
|
+
"persisted_consent"
|
|
3503
|
+
]
|
|
3504
|
+
},
|
|
3505
|
+
{
|
|
3506
|
+
"path": "{cwd}/.campaign-runtime/run-records/*.json",
|
|
3507
|
+
"when": "a STALE run session at the root the command is about to act on is closed out before argv is read",
|
|
3508
|
+
"observed_in": [
|
|
3509
|
+
"stale_session"
|
|
3510
|
+
]
|
|
3511
|
+
},
|
|
3512
|
+
{
|
|
3513
|
+
"path": "{lifecycle-journal}",
|
|
3514
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
3515
|
+
"observed_in": [
|
|
3516
|
+
"no_session",
|
|
3517
|
+
"stale_session",
|
|
3518
|
+
"lifecycle_log",
|
|
3519
|
+
"persisted_consent"
|
|
3520
|
+
]
|
|
3521
|
+
}
|
|
3522
|
+
],
|
|
3523
|
+
"sends": [
|
|
3524
|
+
{
|
|
3525
|
+
"destination": "{proxy-base}/api/spec/{map-id}",
|
|
3526
|
+
"what": "the CampaignSpec fetch",
|
|
3527
|
+
"when": "--map-id is given instead of --spec",
|
|
3528
|
+
"requires_consent": false,
|
|
3529
|
+
"observed_in": [],
|
|
3530
|
+
"not_observed_reason": "the effect test seeds a local --spec, so the Map Builder fetch is declared and not exercised"
|
|
3531
|
+
},
|
|
3532
|
+
{
|
|
3533
|
+
"destination": "{proxy-base}/api/runs",
|
|
3534
|
+
"what": "the Run Record / progress remit envelope for this run",
|
|
3535
|
+
"when": "Run Telemetry consent is on for the endpoint and --no-remit was not given",
|
|
3536
|
+
"requires_consent": true,
|
|
3537
|
+
"observed_in": [],
|
|
3538
|
+
"not_observed_reason": "the stale closeout remits under consent and this invocation does take --proxy-base, but no condition pairs a STALE session with persisted consent: the stale-session condition runs with consent off, and the persisted-consent condition opens no session to close out. The closeout itself is proved under stale_session by the local Run Record it writes"
|
|
3539
|
+
}
|
|
3540
|
+
],
|
|
3541
|
+
"effect_test": "effects: start",
|
|
3542
|
+
"test_scope": "full",
|
|
3543
|
+
"notes": "Intake: Build Packet, sidecars, agent context and the auto-opened run session. Not idempotent — a second `start` over an assembly report that carries stage evidence is refused without --force."
|
|
3544
|
+
},
|
|
3545
|
+
{
|
|
3546
|
+
"command": "start",
|
|
3547
|
+
"subcommand": null,
|
|
3548
|
+
"flags": [
|
|
3549
|
+
"--force"
|
|
3550
|
+
],
|
|
3551
|
+
"annotations": {
|
|
3552
|
+
"readOnlyHint": false,
|
|
3553
|
+
"destructiveHint": true,
|
|
3554
|
+
"openWorldHint": true,
|
|
3555
|
+
"idempotentHint": false
|
|
3556
|
+
},
|
|
3557
|
+
"tier": "C",
|
|
3558
|
+
"writes": [
|
|
3559
|
+
{
|
|
3560
|
+
"path": "{target}/campaign-runtime.build.json",
|
|
3561
|
+
"when": "always — the Build Packet is written into the target",
|
|
3562
|
+
"observed_in": [
|
|
3563
|
+
"no_session",
|
|
3564
|
+
"ambient_session",
|
|
3565
|
+
"stale_session",
|
|
3566
|
+
"lifecycle_log",
|
|
3567
|
+
"persisted_consent"
|
|
3568
|
+
]
|
|
3569
|
+
},
|
|
3570
|
+
{
|
|
3571
|
+
"path": "{target}/.campaign-runtime/build-context.json",
|
|
3572
|
+
"when": "always — the build context sidecar",
|
|
3573
|
+
"observed_in": [
|
|
3574
|
+
"no_session",
|
|
3575
|
+
"ambient_session",
|
|
3576
|
+
"stale_session",
|
|
3577
|
+
"lifecycle_log",
|
|
3578
|
+
"persisted_consent"
|
|
3579
|
+
]
|
|
3580
|
+
},
|
|
3581
|
+
{
|
|
3582
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
3583
|
+
"when": "always — the assembly report for the run",
|
|
3584
|
+
"observed_in": [
|
|
3585
|
+
"no_session",
|
|
3586
|
+
"ambient_session",
|
|
3587
|
+
"stale_session",
|
|
3588
|
+
"lifecycle_log",
|
|
3589
|
+
"persisted_consent"
|
|
3590
|
+
]
|
|
3591
|
+
},
|
|
3592
|
+
{
|
|
3593
|
+
"path": "{target}/.campaign-runtime/input/*",
|
|
3594
|
+
"when": "always — the normalized brief and the design source package",
|
|
3595
|
+
"observed_in": [
|
|
3596
|
+
"no_session",
|
|
3597
|
+
"ambient_session",
|
|
3598
|
+
"stale_session",
|
|
3599
|
+
"lifecycle_log",
|
|
3600
|
+
"persisted_consent"
|
|
3601
|
+
]
|
|
3602
|
+
},
|
|
3603
|
+
{
|
|
3604
|
+
"path": "{target}/.campaign-runtime/theme/theme-report.json",
|
|
3605
|
+
"when": "the theme policy is not off",
|
|
3606
|
+
"observed_in": [
|
|
3607
|
+
"no_session",
|
|
3608
|
+
"ambient_session",
|
|
3609
|
+
"stale_session",
|
|
3610
|
+
"lifecycle_log",
|
|
3611
|
+
"persisted_consent"
|
|
3612
|
+
]
|
|
3613
|
+
},
|
|
3614
|
+
{
|
|
3615
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
3616
|
+
"when": "the intake runs doctor — `start` and `build` do, `prepare-build` alone does not",
|
|
3617
|
+
"observed_in": [
|
|
3618
|
+
"no_session",
|
|
3619
|
+
"ambient_session",
|
|
3620
|
+
"stale_session",
|
|
3621
|
+
"lifecycle_log",
|
|
3622
|
+
"persisted_consent"
|
|
3623
|
+
]
|
|
3624
|
+
},
|
|
3625
|
+
{
|
|
3626
|
+
"path": "{target}/.campaign-runtime/agent-context/*",
|
|
3627
|
+
"when": "always for `start` — the agent context files are installed into the target",
|
|
3628
|
+
"observed_in": [
|
|
3629
|
+
"no_session",
|
|
3630
|
+
"ambient_session",
|
|
3631
|
+
"stale_session",
|
|
3632
|
+
"lifecycle_log",
|
|
3633
|
+
"persisted_consent"
|
|
3634
|
+
]
|
|
3635
|
+
},
|
|
3636
|
+
{
|
|
3637
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
3638
|
+
"when": "the ambient run session is auto-opened (suppressed by --no-run-session)",
|
|
3639
|
+
"observed_in": [
|
|
3640
|
+
"no_session",
|
|
3641
|
+
"stale_session",
|
|
3642
|
+
"lifecycle_log",
|
|
3643
|
+
"persisted_consent"
|
|
3644
|
+
]
|
|
3645
|
+
},
|
|
3646
|
+
{
|
|
3647
|
+
"path": "{target}/.gitignore",
|
|
3648
|
+
"when": "the target does not already ignore the runtime directory",
|
|
3649
|
+
"observed_in": [
|
|
3650
|
+
"no_session",
|
|
3651
|
+
"stale_session",
|
|
3652
|
+
"lifecycle_log",
|
|
3653
|
+
"persisted_consent"
|
|
3654
|
+
]
|
|
3655
|
+
},
|
|
3656
|
+
{
|
|
3657
|
+
"path": "{cwd}/.campaign-runtime/run-records/*.json",
|
|
3658
|
+
"when": "a STALE run session at the root the command is about to act on is closed out before argv is read",
|
|
3659
|
+
"observed_in": [
|
|
3660
|
+
"stale_session"
|
|
3661
|
+
]
|
|
3662
|
+
},
|
|
3663
|
+
{
|
|
3664
|
+
"path": "{lifecycle-journal}",
|
|
3665
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
3666
|
+
"observed_in": [
|
|
3667
|
+
"no_session",
|
|
3668
|
+
"stale_session",
|
|
3669
|
+
"lifecycle_log",
|
|
3670
|
+
"persisted_consent"
|
|
3671
|
+
]
|
|
3672
|
+
}
|
|
3673
|
+
],
|
|
3674
|
+
"sends": [
|
|
3675
|
+
{
|
|
3676
|
+
"destination": "{proxy-base}/api/spec/{map-id}",
|
|
3677
|
+
"what": "the CampaignSpec fetch",
|
|
3678
|
+
"when": "--map-id is given instead of --spec",
|
|
3679
|
+
"requires_consent": false,
|
|
3680
|
+
"observed_in": [],
|
|
3681
|
+
"not_observed_reason": "the effect test seeds a local --spec"
|
|
3682
|
+
},
|
|
3683
|
+
{
|
|
3684
|
+
"destination": "{proxy-base}/api/runs",
|
|
3685
|
+
"what": "the Run Record / progress remit envelope for this run",
|
|
3686
|
+
"when": "Run Telemetry consent is on for the endpoint and --no-remit was not given",
|
|
3687
|
+
"requires_consent": true,
|
|
3688
|
+
"observed_in": [],
|
|
3689
|
+
"not_observed_reason": "the stale closeout remits under consent and this invocation does take --proxy-base, but no condition pairs a STALE session with persisted consent: the stale-session condition runs with consent off, and the persisted-consent condition opens no session to close out. The closeout itself is proved under stale_session by the local Run Record it writes"
|
|
3690
|
+
}
|
|
3691
|
+
],
|
|
3692
|
+
"effect_test": "effects: start --force",
|
|
3693
|
+
"test_scope": "full",
|
|
3694
|
+
"notes": "DESTRUCTIVE: --force overwrites an assembly report that carries stage evidence, printing the stage keys it cleared. This is the flag that makes `start` destructive; the base form refuses instead."
|
|
3695
|
+
},
|
|
3696
|
+
{
|
|
3697
|
+
"command": "start",
|
|
3698
|
+
"subcommand": null,
|
|
3699
|
+
"flags": [
|
|
3700
|
+
"--no-run-session"
|
|
3701
|
+
],
|
|
3702
|
+
"annotations": {
|
|
3703
|
+
"readOnlyHint": false,
|
|
3704
|
+
"destructiveHint": false,
|
|
3705
|
+
"openWorldHint": true,
|
|
3706
|
+
"idempotentHint": false
|
|
3707
|
+
},
|
|
3708
|
+
"tier": "A",
|
|
3709
|
+
"writes": [
|
|
3710
|
+
{
|
|
3711
|
+
"path": "{target}/campaign-runtime.build.json",
|
|
3712
|
+
"when": "always — the Build Packet is written into the target",
|
|
3713
|
+
"observed_in": [
|
|
3714
|
+
"no_session",
|
|
3715
|
+
"ambient_session",
|
|
3716
|
+
"stale_session",
|
|
3717
|
+
"lifecycle_log",
|
|
3718
|
+
"persisted_consent"
|
|
3719
|
+
]
|
|
3720
|
+
},
|
|
3721
|
+
{
|
|
3722
|
+
"path": "{target}/.campaign-runtime/build-context.json",
|
|
3723
|
+
"when": "always — the build context sidecar",
|
|
3724
|
+
"observed_in": [
|
|
3725
|
+
"no_session",
|
|
3726
|
+
"ambient_session",
|
|
3727
|
+
"stale_session",
|
|
3728
|
+
"lifecycle_log",
|
|
3729
|
+
"persisted_consent"
|
|
3730
|
+
]
|
|
3731
|
+
},
|
|
3732
|
+
{
|
|
3733
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
3734
|
+
"when": "always — the assembly report for the run",
|
|
3735
|
+
"observed_in": [
|
|
3736
|
+
"no_session",
|
|
3737
|
+
"ambient_session",
|
|
3738
|
+
"stale_session",
|
|
3739
|
+
"lifecycle_log",
|
|
3740
|
+
"persisted_consent"
|
|
3741
|
+
]
|
|
3742
|
+
},
|
|
3743
|
+
{
|
|
3744
|
+
"path": "{target}/.campaign-runtime/input/*",
|
|
3745
|
+
"when": "always — the normalized brief and the design source package",
|
|
3746
|
+
"observed_in": [
|
|
3747
|
+
"no_session",
|
|
3748
|
+
"ambient_session",
|
|
3749
|
+
"stale_session",
|
|
3750
|
+
"lifecycle_log",
|
|
3751
|
+
"persisted_consent"
|
|
3752
|
+
]
|
|
3753
|
+
},
|
|
3754
|
+
{
|
|
3755
|
+
"path": "{target}/.campaign-runtime/theme/theme-report.json",
|
|
3756
|
+
"when": "the theme policy is not off",
|
|
3757
|
+
"observed_in": [
|
|
3758
|
+
"no_session",
|
|
3759
|
+
"ambient_session",
|
|
3760
|
+
"stale_session",
|
|
3761
|
+
"lifecycle_log",
|
|
3762
|
+
"persisted_consent"
|
|
3763
|
+
]
|
|
3764
|
+
},
|
|
3765
|
+
{
|
|
3766
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
3767
|
+
"when": "the intake runs doctor — `start` and `build` do, `prepare-build` alone does not",
|
|
3768
|
+
"observed_in": [
|
|
3769
|
+
"no_session",
|
|
3770
|
+
"ambient_session",
|
|
3771
|
+
"stale_session",
|
|
3772
|
+
"lifecycle_log",
|
|
3773
|
+
"persisted_consent"
|
|
3774
|
+
]
|
|
3775
|
+
},
|
|
3776
|
+
{
|
|
3777
|
+
"path": "{target}/.campaign-runtime/agent-context/*",
|
|
3778
|
+
"when": "always for `start` — the agent context files are installed into the target",
|
|
3779
|
+
"observed_in": [
|
|
3780
|
+
"no_session",
|
|
3781
|
+
"ambient_session",
|
|
3782
|
+
"stale_session",
|
|
3783
|
+
"lifecycle_log",
|
|
3784
|
+
"persisted_consent"
|
|
3785
|
+
]
|
|
3786
|
+
},
|
|
3787
|
+
{
|
|
3788
|
+
"path": "{target}/.gitignore",
|
|
3789
|
+
"when": "the target does not already ignore the runtime directory",
|
|
3790
|
+
"observed_in": [
|
|
3791
|
+
"no_session",
|
|
3792
|
+
"stale_session",
|
|
3793
|
+
"lifecycle_log",
|
|
3794
|
+
"persisted_consent"
|
|
3795
|
+
]
|
|
3796
|
+
},
|
|
3797
|
+
{
|
|
3798
|
+
"path": "{lifecycle-journal}",
|
|
3799
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
3800
|
+
"observed_in": [
|
|
3801
|
+
"lifecycle_log"
|
|
3802
|
+
]
|
|
3803
|
+
}
|
|
3804
|
+
],
|
|
3805
|
+
"sends": [
|
|
3806
|
+
{
|
|
3807
|
+
"destination": "{proxy-base}/api/spec/{map-id}",
|
|
3808
|
+
"what": "the CampaignSpec fetch",
|
|
3809
|
+
"when": "--map-id is given instead of --spec",
|
|
3810
|
+
"requires_consent": false,
|
|
3811
|
+
"observed_in": [],
|
|
3812
|
+
"not_observed_reason": "the effect test seeds a local --spec"
|
|
3813
|
+
}
|
|
3814
|
+
],
|
|
3815
|
+
"effect_test": "effects: start --no-run-session",
|
|
3816
|
+
"test_scope": "full",
|
|
3817
|
+
"notes": "--no-run-session opts this run out of ambient telemetry: no session file is opened, and with no session to open there is no stale session to close out at the target either."
|
|
3818
|
+
},
|
|
3819
|
+
{
|
|
3820
|
+
"command": "prepare-build",
|
|
3821
|
+
"subcommand": null,
|
|
3822
|
+
"flags": [],
|
|
3823
|
+
"annotations": {
|
|
3824
|
+
"readOnlyHint": false,
|
|
3825
|
+
"destructiveHint": false,
|
|
3826
|
+
"openWorldHint": true,
|
|
3827
|
+
"idempotentHint": false
|
|
3828
|
+
},
|
|
3829
|
+
"tier": "A",
|
|
3830
|
+
"writes": [
|
|
3831
|
+
{
|
|
3832
|
+
"path": "{target}/campaign-runtime.build.json",
|
|
3833
|
+
"when": "always — the Build Packet is written into the target",
|
|
3834
|
+
"observed_in": [
|
|
3835
|
+
"no_session",
|
|
3836
|
+
"ambient_session",
|
|
3837
|
+
"stale_session",
|
|
3838
|
+
"lifecycle_log",
|
|
3839
|
+
"persisted_consent"
|
|
3840
|
+
]
|
|
3841
|
+
},
|
|
3842
|
+
{
|
|
3843
|
+
"path": "{target}/.campaign-runtime/build-context.json",
|
|
3844
|
+
"when": "always — the build context sidecar",
|
|
3845
|
+
"observed_in": [
|
|
3846
|
+
"no_session",
|
|
3847
|
+
"ambient_session",
|
|
3848
|
+
"stale_session",
|
|
3849
|
+
"lifecycle_log",
|
|
3850
|
+
"persisted_consent"
|
|
3851
|
+
]
|
|
3852
|
+
},
|
|
3853
|
+
{
|
|
3854
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
3855
|
+
"when": "always — the assembly report for the run",
|
|
3856
|
+
"observed_in": [
|
|
3857
|
+
"no_session",
|
|
3858
|
+
"ambient_session",
|
|
3859
|
+
"stale_session",
|
|
3860
|
+
"lifecycle_log",
|
|
3861
|
+
"persisted_consent"
|
|
3862
|
+
]
|
|
3863
|
+
},
|
|
3864
|
+
{
|
|
3865
|
+
"path": "{target}/.campaign-runtime/input/*",
|
|
3866
|
+
"when": "always — the normalized brief and the design source package",
|
|
3867
|
+
"observed_in": [
|
|
3868
|
+
"no_session",
|
|
3869
|
+
"ambient_session",
|
|
3870
|
+
"stale_session",
|
|
3871
|
+
"lifecycle_log",
|
|
3872
|
+
"persisted_consent"
|
|
3873
|
+
]
|
|
3874
|
+
},
|
|
3875
|
+
{
|
|
3876
|
+
"path": "{target}/.campaign-runtime/theme/theme-report.json",
|
|
3877
|
+
"when": "the theme policy is not off",
|
|
3878
|
+
"observed_in": [
|
|
3879
|
+
"no_session",
|
|
3880
|
+
"ambient_session",
|
|
3881
|
+
"stale_session",
|
|
3882
|
+
"lifecycle_log",
|
|
3883
|
+
"persisted_consent"
|
|
3884
|
+
]
|
|
3885
|
+
},
|
|
3886
|
+
{
|
|
3887
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
3888
|
+
"when": "the ambient run session is auto-opened (suppressed by --no-run-session)",
|
|
3889
|
+
"observed_in": [
|
|
3890
|
+
"no_session",
|
|
3891
|
+
"stale_session",
|
|
3892
|
+
"lifecycle_log",
|
|
3893
|
+
"persisted_consent"
|
|
3894
|
+
]
|
|
3895
|
+
},
|
|
3896
|
+
{
|
|
3897
|
+
"path": "{target}/.gitignore",
|
|
3898
|
+
"when": "the target does not already ignore the runtime directory",
|
|
3899
|
+
"observed_in": [
|
|
3900
|
+
"no_session",
|
|
3901
|
+
"stale_session",
|
|
3902
|
+
"lifecycle_log",
|
|
3903
|
+
"persisted_consent"
|
|
3904
|
+
]
|
|
3905
|
+
},
|
|
3906
|
+
{
|
|
3907
|
+
"path": "{cwd}/.campaign-runtime/run-records/*.json",
|
|
3908
|
+
"when": "a STALE run session at the root the command is about to act on is closed out before argv is read",
|
|
3909
|
+
"observed_in": [
|
|
3910
|
+
"stale_session"
|
|
3911
|
+
]
|
|
3912
|
+
},
|
|
3913
|
+
{
|
|
3914
|
+
"path": "{lifecycle-journal}",
|
|
3915
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
3916
|
+
"observed_in": [
|
|
3917
|
+
"no_session",
|
|
3918
|
+
"stale_session",
|
|
3919
|
+
"lifecycle_log",
|
|
3920
|
+
"persisted_consent"
|
|
3921
|
+
]
|
|
3922
|
+
}
|
|
3923
|
+
],
|
|
3924
|
+
"sends": [
|
|
3925
|
+
{
|
|
3926
|
+
"destination": "{proxy-base}/api/spec/{map-id}",
|
|
3927
|
+
"what": "the CampaignSpec fetch",
|
|
3928
|
+
"when": "--map-id is given instead of --spec",
|
|
3929
|
+
"requires_consent": false,
|
|
3930
|
+
"observed_in": [],
|
|
3931
|
+
"not_observed_reason": "the effect test seeds a local --spec"
|
|
3932
|
+
},
|
|
3933
|
+
{
|
|
3934
|
+
"destination": "{proxy-base}/api/runs",
|
|
3935
|
+
"what": "the Run Record / progress remit envelope for this run",
|
|
3936
|
+
"when": "Run Telemetry consent is on for the endpoint and --no-remit was not given",
|
|
3937
|
+
"requires_consent": true,
|
|
3938
|
+
"observed_in": [],
|
|
3939
|
+
"not_observed_reason": "the stale closeout remits under consent and this invocation does take --proxy-base, but no condition pairs a STALE session with persisted consent: the stale-session condition runs with consent off, and the persisted-consent condition opens no session to close out. The closeout itself is proved under stale_session by the local Run Record it writes"
|
|
3940
|
+
}
|
|
3941
|
+
],
|
|
3942
|
+
"effect_test": "effects: prepare-build",
|
|
3943
|
+
"test_scope": "full",
|
|
3944
|
+
"notes": "Intake without doctor and without the agent-context install: the packet, the sidecars and the auto-opened session. Same stale-session closeout as `start`."
|
|
3945
|
+
},
|
|
3946
|
+
{
|
|
3947
|
+
"command": "prepare-build",
|
|
3948
|
+
"subcommand": null,
|
|
3949
|
+
"flags": [
|
|
3950
|
+
"--no-run-session"
|
|
3951
|
+
],
|
|
3952
|
+
"annotations": {
|
|
3953
|
+
"readOnlyHint": false,
|
|
3954
|
+
"destructiveHint": false,
|
|
3955
|
+
"openWorldHint": true,
|
|
3956
|
+
"idempotentHint": false
|
|
3957
|
+
},
|
|
3958
|
+
"tier": "A",
|
|
3959
|
+
"writes": [
|
|
3960
|
+
{
|
|
3961
|
+
"path": "{target}/campaign-runtime.build.json",
|
|
3962
|
+
"when": "always — the Build Packet is written into the target",
|
|
3963
|
+
"observed_in": [
|
|
3964
|
+
"no_session",
|
|
3965
|
+
"ambient_session",
|
|
3966
|
+
"stale_session",
|
|
3967
|
+
"lifecycle_log",
|
|
3968
|
+
"persisted_consent"
|
|
3969
|
+
]
|
|
3970
|
+
},
|
|
3971
|
+
{
|
|
3972
|
+
"path": "{target}/.campaign-runtime/build-context.json",
|
|
3973
|
+
"when": "always — the build context sidecar",
|
|
3974
|
+
"observed_in": [
|
|
3975
|
+
"no_session",
|
|
3976
|
+
"ambient_session",
|
|
3977
|
+
"stale_session",
|
|
3978
|
+
"lifecycle_log",
|
|
3979
|
+
"persisted_consent"
|
|
3980
|
+
]
|
|
3981
|
+
},
|
|
3982
|
+
{
|
|
3983
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
3984
|
+
"when": "always — the assembly report for the run",
|
|
3985
|
+
"observed_in": [
|
|
3986
|
+
"no_session",
|
|
3987
|
+
"ambient_session",
|
|
3988
|
+
"stale_session",
|
|
3989
|
+
"lifecycle_log",
|
|
3990
|
+
"persisted_consent"
|
|
3991
|
+
]
|
|
3992
|
+
},
|
|
3993
|
+
{
|
|
3994
|
+
"path": "{target}/.campaign-runtime/input/*",
|
|
3995
|
+
"when": "always — the normalized brief and the design source package",
|
|
3996
|
+
"observed_in": [
|
|
3997
|
+
"no_session",
|
|
3998
|
+
"ambient_session",
|
|
3999
|
+
"stale_session",
|
|
4000
|
+
"lifecycle_log",
|
|
4001
|
+
"persisted_consent"
|
|
4002
|
+
]
|
|
4003
|
+
},
|
|
4004
|
+
{
|
|
4005
|
+
"path": "{target}/.campaign-runtime/theme/theme-report.json",
|
|
4006
|
+
"when": "the theme policy is not off",
|
|
4007
|
+
"observed_in": [
|
|
4008
|
+
"no_session",
|
|
4009
|
+
"ambient_session",
|
|
4010
|
+
"stale_session",
|
|
4011
|
+
"lifecycle_log",
|
|
4012
|
+
"persisted_consent"
|
|
4013
|
+
]
|
|
4014
|
+
},
|
|
4015
|
+
{
|
|
4016
|
+
"path": "{target}/.gitignore",
|
|
4017
|
+
"when": "the target does not already ignore the runtime directory",
|
|
4018
|
+
"observed_in": [
|
|
4019
|
+
"no_session",
|
|
4020
|
+
"stale_session",
|
|
4021
|
+
"lifecycle_log",
|
|
4022
|
+
"persisted_consent"
|
|
4023
|
+
]
|
|
4024
|
+
},
|
|
4025
|
+
{
|
|
4026
|
+
"path": "{lifecycle-journal}",
|
|
4027
|
+
"when": "a lifecycle journal is selected by --lifecycle-journal or CAMPAIGNS_OS_LIFECYCLE_LOG — with no session opened, an ambient one at the target is not adopted for this run",
|
|
4028
|
+
"observed_in": [
|
|
4029
|
+
"lifecycle_log"
|
|
4030
|
+
]
|
|
4031
|
+
}
|
|
4032
|
+
],
|
|
4033
|
+
"sends": [
|
|
4034
|
+
{
|
|
4035
|
+
"destination": "{proxy-base}/api/spec/{map-id}",
|
|
4036
|
+
"what": "the CampaignSpec fetch",
|
|
4037
|
+
"when": "--map-id is given instead of --spec",
|
|
4038
|
+
"requires_consent": false,
|
|
4039
|
+
"observed_in": [],
|
|
4040
|
+
"not_observed_reason": "the effect test seeds a local --spec"
|
|
4041
|
+
}
|
|
4042
|
+
],
|
|
4043
|
+
"effect_test": "effects: prepare-build --no-run-session",
|
|
4044
|
+
"test_scope": "full",
|
|
4045
|
+
"notes": "--no-run-session opts this run out of ambient telemetry: no session file is opened, and with no session to open there is no stale session to close out at the target either. The intake writes are the base form's."
|
|
4046
|
+
},
|
|
4047
|
+
{
|
|
4048
|
+
"command": "prepare-build",
|
|
4049
|
+
"subcommand": null,
|
|
4050
|
+
"flags": [
|
|
4051
|
+
"--force"
|
|
4052
|
+
],
|
|
4053
|
+
"annotations": {
|
|
4054
|
+
"readOnlyHint": false,
|
|
4055
|
+
"destructiveHint": true,
|
|
4056
|
+
"openWorldHint": true,
|
|
4057
|
+
"idempotentHint": false
|
|
4058
|
+
},
|
|
4059
|
+
"tier": "C",
|
|
4060
|
+
"writes": [
|
|
4061
|
+
{
|
|
4062
|
+
"path": "{target}/campaign-runtime.build.json",
|
|
4063
|
+
"when": "always — the Build Packet is written into the target",
|
|
4064
|
+
"observed_in": [
|
|
4065
|
+
"no_session",
|
|
4066
|
+
"ambient_session",
|
|
4067
|
+
"stale_session",
|
|
4068
|
+
"lifecycle_log",
|
|
4069
|
+
"persisted_consent"
|
|
4070
|
+
]
|
|
4071
|
+
},
|
|
4072
|
+
{
|
|
4073
|
+
"path": "{target}/.campaign-runtime/build-context.json",
|
|
4074
|
+
"when": "always — the build context sidecar",
|
|
4075
|
+
"observed_in": [
|
|
4076
|
+
"no_session",
|
|
4077
|
+
"ambient_session",
|
|
4078
|
+
"stale_session",
|
|
4079
|
+
"lifecycle_log",
|
|
4080
|
+
"persisted_consent"
|
|
4081
|
+
]
|
|
4082
|
+
},
|
|
4083
|
+
{
|
|
4084
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
4085
|
+
"when": "always — the assembly report for the run",
|
|
4086
|
+
"observed_in": [
|
|
4087
|
+
"no_session",
|
|
4088
|
+
"ambient_session",
|
|
4089
|
+
"stale_session",
|
|
4090
|
+
"lifecycle_log",
|
|
4091
|
+
"persisted_consent"
|
|
4092
|
+
]
|
|
4093
|
+
},
|
|
4094
|
+
{
|
|
4095
|
+
"path": "{target}/.campaign-runtime/input/*",
|
|
4096
|
+
"when": "always — the normalized brief and the design source package",
|
|
4097
|
+
"observed_in": [
|
|
4098
|
+
"no_session",
|
|
4099
|
+
"ambient_session",
|
|
4100
|
+
"stale_session",
|
|
4101
|
+
"lifecycle_log",
|
|
4102
|
+
"persisted_consent"
|
|
4103
|
+
]
|
|
4104
|
+
},
|
|
4105
|
+
{
|
|
4106
|
+
"path": "{target}/.campaign-runtime/theme/theme-report.json",
|
|
4107
|
+
"when": "the theme policy is not off",
|
|
4108
|
+
"observed_in": [
|
|
4109
|
+
"no_session",
|
|
4110
|
+
"ambient_session",
|
|
4111
|
+
"stale_session",
|
|
4112
|
+
"lifecycle_log",
|
|
4113
|
+
"persisted_consent"
|
|
4114
|
+
]
|
|
4115
|
+
},
|
|
4116
|
+
{
|
|
4117
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
4118
|
+
"when": "the ambient run session is auto-opened (suppressed by --no-run-session)",
|
|
4119
|
+
"observed_in": [
|
|
4120
|
+
"no_session",
|
|
4121
|
+
"stale_session",
|
|
4122
|
+
"lifecycle_log",
|
|
4123
|
+
"persisted_consent"
|
|
4124
|
+
]
|
|
4125
|
+
},
|
|
4126
|
+
{
|
|
4127
|
+
"path": "{target}/.gitignore",
|
|
4128
|
+
"when": "the target does not already ignore the runtime directory",
|
|
4129
|
+
"observed_in": [
|
|
4130
|
+
"no_session",
|
|
4131
|
+
"stale_session",
|
|
4132
|
+
"lifecycle_log",
|
|
4133
|
+
"persisted_consent"
|
|
4134
|
+
]
|
|
4135
|
+
},
|
|
4136
|
+
{
|
|
4137
|
+
"path": "{cwd}/.campaign-runtime/run-records/*.json",
|
|
4138
|
+
"when": "a STALE run session at the root the command is about to act on is closed out before argv is read",
|
|
4139
|
+
"observed_in": [
|
|
4140
|
+
"stale_session"
|
|
4141
|
+
]
|
|
4142
|
+
},
|
|
4143
|
+
{
|
|
4144
|
+
"path": "{lifecycle-journal}",
|
|
4145
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
4146
|
+
"observed_in": [
|
|
4147
|
+
"no_session",
|
|
4148
|
+
"stale_session",
|
|
4149
|
+
"lifecycle_log",
|
|
4150
|
+
"persisted_consent"
|
|
4151
|
+
]
|
|
4152
|
+
}
|
|
4153
|
+
],
|
|
4154
|
+
"sends": [
|
|
4155
|
+
{
|
|
4156
|
+
"destination": "{proxy-base}/api/spec/{map-id}",
|
|
4157
|
+
"what": "the CampaignSpec fetch",
|
|
4158
|
+
"when": "--map-id is given instead of --spec",
|
|
4159
|
+
"requires_consent": false,
|
|
4160
|
+
"observed_in": [],
|
|
4161
|
+
"not_observed_reason": "the effect test seeds a local --spec"
|
|
4162
|
+
},
|
|
4163
|
+
{
|
|
4164
|
+
"destination": "{proxy-base}/api/runs",
|
|
4165
|
+
"what": "the Run Record / progress remit envelope for this run",
|
|
4166
|
+
"when": "Run Telemetry consent is on for the endpoint and --no-remit was not given",
|
|
4167
|
+
"requires_consent": true,
|
|
4168
|
+
"observed_in": [],
|
|
4169
|
+
"not_observed_reason": "the stale closeout remits under consent and this invocation does take --proxy-base, but no condition pairs a STALE session with persisted consent: the stale-session condition runs with consent off, and the persisted-consent condition opens no session to close out. The closeout itself is proved under stale_session by the local Run Record it writes"
|
|
4170
|
+
}
|
|
4171
|
+
],
|
|
4172
|
+
"effect_test": "effects: prepare-build --force",
|
|
4173
|
+
"test_scope": "full",
|
|
4174
|
+
"notes": "DESTRUCTIVE: --force overwrites an assembly report that carries stage evidence, printing the stage keys it cleared. This is the flag that makes `prepare-build` destructive; the base form refuses instead. Everything else it writes is the base form's intake."
|
|
4175
|
+
},
|
|
4176
|
+
{
|
|
4177
|
+
"command": "build",
|
|
4178
|
+
"subcommand": null,
|
|
4179
|
+
"flags": [],
|
|
4180
|
+
"annotations": {
|
|
4181
|
+
"readOnlyHint": false,
|
|
4182
|
+
"destructiveHint": false,
|
|
4183
|
+
"openWorldHint": true,
|
|
4184
|
+
"idempotentHint": false
|
|
4185
|
+
},
|
|
4186
|
+
"tier": "A",
|
|
4187
|
+
"writes": [
|
|
4188
|
+
{
|
|
4189
|
+
"path": "{target}/campaign-runtime.build.json",
|
|
4190
|
+
"when": "always — the Build Packet is written into the target",
|
|
4191
|
+
"observed_in": [
|
|
4192
|
+
"no_session",
|
|
4193
|
+
"ambient_session",
|
|
4194
|
+
"stale_session",
|
|
4195
|
+
"lifecycle_log",
|
|
4196
|
+
"persisted_consent"
|
|
4197
|
+
]
|
|
4198
|
+
},
|
|
4199
|
+
{
|
|
4200
|
+
"path": "{target}/.campaign-runtime/build-context.json",
|
|
4201
|
+
"when": "always — the build context sidecar",
|
|
4202
|
+
"observed_in": [
|
|
4203
|
+
"no_session",
|
|
4204
|
+
"ambient_session",
|
|
4205
|
+
"stale_session",
|
|
4206
|
+
"lifecycle_log",
|
|
4207
|
+
"persisted_consent"
|
|
4208
|
+
]
|
|
4209
|
+
},
|
|
4210
|
+
{
|
|
4211
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
4212
|
+
"when": "always — the assembly report for the run",
|
|
4213
|
+
"observed_in": [
|
|
4214
|
+
"no_session",
|
|
4215
|
+
"ambient_session",
|
|
4216
|
+
"stale_session",
|
|
4217
|
+
"lifecycle_log",
|
|
4218
|
+
"persisted_consent"
|
|
4219
|
+
]
|
|
4220
|
+
},
|
|
4221
|
+
{
|
|
4222
|
+
"path": "{target}/.campaign-runtime/input/*",
|
|
4223
|
+
"when": "always — the normalized brief and the design source package",
|
|
4224
|
+
"observed_in": [
|
|
4225
|
+
"no_session",
|
|
4226
|
+
"ambient_session",
|
|
4227
|
+
"stale_session",
|
|
4228
|
+
"lifecycle_log",
|
|
4229
|
+
"persisted_consent"
|
|
4230
|
+
]
|
|
4231
|
+
},
|
|
4232
|
+
{
|
|
4233
|
+
"path": "{target}/.campaign-runtime/theme/theme-report.json",
|
|
4234
|
+
"when": "the theme policy is not off",
|
|
4235
|
+
"observed_in": [
|
|
4236
|
+
"no_session",
|
|
4237
|
+
"ambient_session",
|
|
4238
|
+
"stale_session",
|
|
4239
|
+
"lifecycle_log",
|
|
4240
|
+
"persisted_consent"
|
|
4241
|
+
]
|
|
4242
|
+
},
|
|
4243
|
+
{
|
|
4244
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
4245
|
+
"when": "the intake runs doctor — `start` and `build` do, `prepare-build` alone does not",
|
|
4246
|
+
"observed_in": [
|
|
4247
|
+
"no_session",
|
|
4248
|
+
"ambient_session",
|
|
4249
|
+
"stale_session",
|
|
4250
|
+
"lifecycle_log",
|
|
4251
|
+
"persisted_consent"
|
|
4252
|
+
]
|
|
4253
|
+
},
|
|
4254
|
+
{
|
|
4255
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
4256
|
+
"when": "the ambient run session is auto-opened (suppressed by --no-run-session)",
|
|
4257
|
+
"observed_in": [
|
|
4258
|
+
"no_session",
|
|
4259
|
+
"stale_session",
|
|
4260
|
+
"lifecycle_log",
|
|
4261
|
+
"persisted_consent"
|
|
4262
|
+
]
|
|
4263
|
+
},
|
|
4264
|
+
{
|
|
4265
|
+
"path": "{target}/.gitignore",
|
|
4266
|
+
"when": "the target does not already ignore the runtime directory",
|
|
4267
|
+
"observed_in": [
|
|
4268
|
+
"no_session",
|
|
4269
|
+
"stale_session",
|
|
4270
|
+
"lifecycle_log",
|
|
4271
|
+
"persisted_consent"
|
|
4272
|
+
]
|
|
4273
|
+
},
|
|
4274
|
+
{
|
|
4275
|
+
"path": "{cwd}/.campaign-runtime/run-records/*.json",
|
|
4276
|
+
"when": "a STALE run session at the root the command is about to act on is closed out before argv is read",
|
|
4277
|
+
"observed_in": [
|
|
4278
|
+
"stale_session"
|
|
4279
|
+
]
|
|
4280
|
+
},
|
|
4281
|
+
{
|
|
4282
|
+
"path": "{lifecycle-journal}",
|
|
4283
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
4284
|
+
"observed_in": [
|
|
4285
|
+
"no_session",
|
|
4286
|
+
"stale_session",
|
|
4287
|
+
"lifecycle_log",
|
|
4288
|
+
"persisted_consent"
|
|
4289
|
+
]
|
|
4290
|
+
}
|
|
4291
|
+
],
|
|
4292
|
+
"sends": [
|
|
4293
|
+
{
|
|
4294
|
+
"destination": "{proxy-base}/api/spec/{map-id}",
|
|
4295
|
+
"what": "the CampaignSpec fetch",
|
|
4296
|
+
"when": "--map-id is given instead of --spec",
|
|
4297
|
+
"requires_consent": false,
|
|
4298
|
+
"observed_in": [],
|
|
4299
|
+
"not_observed_reason": "the effect test seeds a local --spec"
|
|
4300
|
+
},
|
|
4301
|
+
{
|
|
4302
|
+
"destination": "{proxy-base}/api/runs",
|
|
4303
|
+
"what": "the Run Record / progress remit envelope for this run",
|
|
4304
|
+
"when": "Run Telemetry consent is on for the endpoint and --no-remit was not given",
|
|
4305
|
+
"requires_consent": true,
|
|
4306
|
+
"observed_in": [],
|
|
4307
|
+
"not_observed_reason": "the stale closeout remits under consent and this invocation does take --proxy-base, but no condition pairs a STALE session with persisted consent: the stale-session condition runs with consent off, and the persisted-consent condition opens no session to close out. The closeout itself is proved under stale_session by the local Run Record it writes"
|
|
4308
|
+
}
|
|
4309
|
+
],
|
|
4310
|
+
"effect_test": "effects: build",
|
|
4311
|
+
"test_scope": "full",
|
|
4312
|
+
"notes": "The intake alias for prepare-build + doctor: the same packet and sidecars, plus the doctor sidecar. It does not install the agent context."
|
|
4313
|
+
},
|
|
4314
|
+
{
|
|
4315
|
+
"command": "build",
|
|
4316
|
+
"subcommand": null,
|
|
4317
|
+
"flags": [
|
|
4318
|
+
"--no-run-session"
|
|
4319
|
+
],
|
|
4320
|
+
"annotations": {
|
|
4321
|
+
"readOnlyHint": false,
|
|
4322
|
+
"destructiveHint": false,
|
|
4323
|
+
"openWorldHint": true,
|
|
4324
|
+
"idempotentHint": false
|
|
4325
|
+
},
|
|
4326
|
+
"tier": "A",
|
|
4327
|
+
"writes": [
|
|
4328
|
+
{
|
|
4329
|
+
"path": "{target}/campaign-runtime.build.json",
|
|
4330
|
+
"when": "always — the Build Packet is written into the target",
|
|
4331
|
+
"observed_in": [
|
|
4332
|
+
"no_session",
|
|
4333
|
+
"ambient_session",
|
|
4334
|
+
"stale_session",
|
|
4335
|
+
"lifecycle_log",
|
|
4336
|
+
"persisted_consent"
|
|
4337
|
+
]
|
|
4338
|
+
},
|
|
4339
|
+
{
|
|
4340
|
+
"path": "{target}/.campaign-runtime/build-context.json",
|
|
4341
|
+
"when": "always — the build context sidecar",
|
|
4342
|
+
"observed_in": [
|
|
4343
|
+
"no_session",
|
|
4344
|
+
"ambient_session",
|
|
4345
|
+
"stale_session",
|
|
4346
|
+
"lifecycle_log",
|
|
4347
|
+
"persisted_consent"
|
|
4348
|
+
]
|
|
4349
|
+
},
|
|
4350
|
+
{
|
|
4351
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
4352
|
+
"when": "always — the assembly report for the run",
|
|
4353
|
+
"observed_in": [
|
|
4354
|
+
"no_session",
|
|
4355
|
+
"ambient_session",
|
|
4356
|
+
"stale_session",
|
|
4357
|
+
"lifecycle_log",
|
|
4358
|
+
"persisted_consent"
|
|
4359
|
+
]
|
|
4360
|
+
},
|
|
4361
|
+
{
|
|
4362
|
+
"path": "{target}/.campaign-runtime/input/*",
|
|
4363
|
+
"when": "always — the normalized brief and the design source package",
|
|
4364
|
+
"observed_in": [
|
|
4365
|
+
"no_session",
|
|
4366
|
+
"ambient_session",
|
|
4367
|
+
"stale_session",
|
|
4368
|
+
"lifecycle_log",
|
|
4369
|
+
"persisted_consent"
|
|
4370
|
+
]
|
|
4371
|
+
},
|
|
4372
|
+
{
|
|
4373
|
+
"path": "{target}/.campaign-runtime/theme/theme-report.json",
|
|
4374
|
+
"when": "the theme policy is not off",
|
|
4375
|
+
"observed_in": [
|
|
4376
|
+
"no_session",
|
|
4377
|
+
"ambient_session",
|
|
4378
|
+
"stale_session",
|
|
4379
|
+
"lifecycle_log",
|
|
4380
|
+
"persisted_consent"
|
|
4381
|
+
]
|
|
4382
|
+
},
|
|
4383
|
+
{
|
|
4384
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
4385
|
+
"when": "the intake runs doctor — `start` and `build` do, `prepare-build` alone does not",
|
|
4386
|
+
"observed_in": [
|
|
4387
|
+
"no_session",
|
|
4388
|
+
"ambient_session",
|
|
4389
|
+
"stale_session",
|
|
4390
|
+
"lifecycle_log",
|
|
4391
|
+
"persisted_consent"
|
|
4392
|
+
]
|
|
4393
|
+
},
|
|
4394
|
+
{
|
|
4395
|
+
"path": "{target}/.gitignore",
|
|
4396
|
+
"when": "the target does not already ignore the runtime directory",
|
|
4397
|
+
"observed_in": [
|
|
4398
|
+
"no_session",
|
|
4399
|
+
"stale_session",
|
|
4400
|
+
"lifecycle_log",
|
|
4401
|
+
"persisted_consent"
|
|
4402
|
+
]
|
|
4403
|
+
},
|
|
4404
|
+
{
|
|
4405
|
+
"path": "{lifecycle-journal}",
|
|
4406
|
+
"when": "a lifecycle journal is selected by --lifecycle-journal or CAMPAIGNS_OS_LIFECYCLE_LOG — with no session opened, an ambient one at the target is not adopted for this run",
|
|
4407
|
+
"observed_in": [
|
|
4408
|
+
"lifecycle_log"
|
|
4409
|
+
]
|
|
4410
|
+
}
|
|
4411
|
+
],
|
|
4412
|
+
"sends": [
|
|
4413
|
+
{
|
|
4414
|
+
"destination": "{proxy-base}/api/spec/{map-id}",
|
|
4415
|
+
"what": "the CampaignSpec fetch",
|
|
4416
|
+
"when": "--map-id is given instead of --spec",
|
|
4417
|
+
"requires_consent": false,
|
|
4418
|
+
"observed_in": [],
|
|
4419
|
+
"not_observed_reason": "the effect test seeds a local --spec"
|
|
4420
|
+
}
|
|
4421
|
+
],
|
|
4422
|
+
"effect_test": "effects: build --no-run-session",
|
|
4423
|
+
"test_scope": "full",
|
|
4424
|
+
"notes": "--no-run-session opts this run out of ambient telemetry: no session file is opened, and with no session to open there is no stale session to close out at the target either. The intake writes are the base form's."
|
|
4425
|
+
},
|
|
4426
|
+
{
|
|
4427
|
+
"command": "build",
|
|
4428
|
+
"subcommand": null,
|
|
4429
|
+
"flags": [
|
|
4430
|
+
"--force"
|
|
4431
|
+
],
|
|
4432
|
+
"annotations": {
|
|
4433
|
+
"readOnlyHint": false,
|
|
4434
|
+
"destructiveHint": true,
|
|
4435
|
+
"openWorldHint": true,
|
|
4436
|
+
"idempotentHint": false
|
|
4437
|
+
},
|
|
4438
|
+
"tier": "C",
|
|
4439
|
+
"writes": [
|
|
4440
|
+
{
|
|
4441
|
+
"path": "{target}/campaign-runtime.build.json",
|
|
4442
|
+
"when": "always — the Build Packet is written into the target",
|
|
4443
|
+
"observed_in": [
|
|
4444
|
+
"no_session",
|
|
4445
|
+
"ambient_session",
|
|
4446
|
+
"stale_session",
|
|
4447
|
+
"lifecycle_log",
|
|
4448
|
+
"persisted_consent"
|
|
4449
|
+
]
|
|
4450
|
+
},
|
|
4451
|
+
{
|
|
4452
|
+
"path": "{target}/.campaign-runtime/build-context.json",
|
|
4453
|
+
"when": "always — the build context sidecar",
|
|
4454
|
+
"observed_in": [
|
|
4455
|
+
"no_session",
|
|
4456
|
+
"ambient_session",
|
|
4457
|
+
"stale_session",
|
|
4458
|
+
"lifecycle_log",
|
|
4459
|
+
"persisted_consent"
|
|
4460
|
+
]
|
|
4461
|
+
},
|
|
4462
|
+
{
|
|
4463
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
4464
|
+
"when": "always — the assembly report for the run",
|
|
4465
|
+
"observed_in": [
|
|
4466
|
+
"no_session",
|
|
4467
|
+
"ambient_session",
|
|
4468
|
+
"stale_session",
|
|
4469
|
+
"lifecycle_log",
|
|
4470
|
+
"persisted_consent"
|
|
4471
|
+
]
|
|
4472
|
+
},
|
|
4473
|
+
{
|
|
4474
|
+
"path": "{target}/.campaign-runtime/input/*",
|
|
4475
|
+
"when": "always — the normalized brief and the design source package",
|
|
4476
|
+
"observed_in": [
|
|
4477
|
+
"no_session",
|
|
4478
|
+
"ambient_session",
|
|
4479
|
+
"stale_session",
|
|
4480
|
+
"lifecycle_log",
|
|
4481
|
+
"persisted_consent"
|
|
4482
|
+
]
|
|
4483
|
+
},
|
|
4484
|
+
{
|
|
4485
|
+
"path": "{target}/.campaign-runtime/theme/theme-report.json",
|
|
4486
|
+
"when": "the theme policy is not off",
|
|
4487
|
+
"observed_in": [
|
|
4488
|
+
"no_session",
|
|
4489
|
+
"ambient_session",
|
|
4490
|
+
"stale_session",
|
|
4491
|
+
"lifecycle_log",
|
|
4492
|
+
"persisted_consent"
|
|
4493
|
+
]
|
|
4494
|
+
},
|
|
4495
|
+
{
|
|
4496
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
4497
|
+
"when": "the intake runs doctor — `start` and `build` do, `prepare-build` alone does not",
|
|
4498
|
+
"observed_in": [
|
|
4499
|
+
"no_session",
|
|
4500
|
+
"ambient_session",
|
|
4501
|
+
"stale_session",
|
|
4502
|
+
"lifecycle_log",
|
|
4503
|
+
"persisted_consent"
|
|
4504
|
+
]
|
|
4505
|
+
},
|
|
4506
|
+
{
|
|
4507
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
4508
|
+
"when": "the ambient run session is auto-opened (suppressed by --no-run-session)",
|
|
4509
|
+
"observed_in": [
|
|
4510
|
+
"no_session",
|
|
4511
|
+
"stale_session",
|
|
4512
|
+
"lifecycle_log",
|
|
4513
|
+
"persisted_consent"
|
|
4514
|
+
]
|
|
4515
|
+
},
|
|
4516
|
+
{
|
|
4517
|
+
"path": "{target}/.gitignore",
|
|
4518
|
+
"when": "the target does not already ignore the runtime directory",
|
|
4519
|
+
"observed_in": [
|
|
4520
|
+
"no_session",
|
|
4521
|
+
"stale_session",
|
|
4522
|
+
"lifecycle_log",
|
|
4523
|
+
"persisted_consent"
|
|
4524
|
+
]
|
|
4525
|
+
},
|
|
4526
|
+
{
|
|
4527
|
+
"path": "{cwd}/.campaign-runtime/run-records/*.json",
|
|
4528
|
+
"when": "a STALE run session at the root the command is about to act on is closed out before argv is read",
|
|
4529
|
+
"observed_in": [
|
|
4530
|
+
"stale_session"
|
|
4531
|
+
]
|
|
4532
|
+
},
|
|
4533
|
+
{
|
|
4534
|
+
"path": "{lifecycle-journal}",
|
|
4535
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
4536
|
+
"observed_in": [
|
|
4537
|
+
"no_session",
|
|
4538
|
+
"stale_session",
|
|
4539
|
+
"lifecycle_log",
|
|
4540
|
+
"persisted_consent"
|
|
4541
|
+
]
|
|
4542
|
+
}
|
|
4543
|
+
],
|
|
4544
|
+
"sends": [
|
|
4545
|
+
{
|
|
4546
|
+
"destination": "{proxy-base}/api/spec/{map-id}",
|
|
4547
|
+
"what": "the CampaignSpec fetch",
|
|
4548
|
+
"when": "--map-id is given instead of --spec",
|
|
4549
|
+
"requires_consent": false,
|
|
4550
|
+
"observed_in": [],
|
|
4551
|
+
"not_observed_reason": "the effect test seeds a local --spec"
|
|
4552
|
+
},
|
|
4553
|
+
{
|
|
4554
|
+
"destination": "{proxy-base}/api/runs",
|
|
4555
|
+
"what": "the Run Record / progress remit envelope for this run",
|
|
4556
|
+
"when": "Run Telemetry consent is on for the endpoint and --no-remit was not given",
|
|
4557
|
+
"requires_consent": true,
|
|
4558
|
+
"observed_in": [],
|
|
4559
|
+
"not_observed_reason": "the stale closeout remits under consent and this invocation does take --proxy-base, but no condition pairs a STALE session with persisted consent: the stale-session condition runs with consent off, and the persisted-consent condition opens no session to close out. The closeout itself is proved under stale_session by the local Run Record it writes"
|
|
4560
|
+
}
|
|
4561
|
+
],
|
|
4562
|
+
"effect_test": "effects: build --force",
|
|
4563
|
+
"test_scope": "full",
|
|
4564
|
+
"notes": "DESTRUCTIVE: --force overwrites an assembly report that carries stage evidence, printing the stage keys it cleared. This is the flag that makes `build` destructive; the base form refuses instead. Everything else it writes is the base form's intake."
|
|
4565
|
+
},
|
|
4566
|
+
{
|
|
4567
|
+
"command": "spec",
|
|
4568
|
+
"subcommand": "derive",
|
|
4569
|
+
"flags": [
|
|
4570
|
+
"--from-store"
|
|
4571
|
+
],
|
|
4572
|
+
"annotations": {
|
|
4573
|
+
"readOnlyHint": false,
|
|
4574
|
+
"destructiveHint": false,
|
|
4575
|
+
"openWorldHint": true,
|
|
4576
|
+
"idempotentHint": true
|
|
4577
|
+
},
|
|
4578
|
+
"tier": "A",
|
|
4579
|
+
"writes": [
|
|
4580
|
+
{
|
|
4581
|
+
"path": "{spec}",
|
|
4582
|
+
"when": "the store states one of the nine campaign.store_* fields",
|
|
4583
|
+
"observed_in": [],
|
|
4584
|
+
"not_observed_reason": "the store read is refused for a missing credential before any field is derived"
|
|
4585
|
+
},
|
|
4586
|
+
{
|
|
4587
|
+
"path": "{lifecycle-journal}",
|
|
4588
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
4589
|
+
"observed_in": [
|
|
4590
|
+
"ambient_session",
|
|
4591
|
+
"lifecycle_log"
|
|
4592
|
+
]
|
|
4593
|
+
}
|
|
4594
|
+
],
|
|
4595
|
+
"sends": [
|
|
4596
|
+
{
|
|
4597
|
+
"destination": "the 29next Admin API for the named store, through the campaigns-os login gateway",
|
|
4598
|
+
"what": "GET /store/ and GET /pages/ under the stored gateway credential",
|
|
4599
|
+
"when": "a gateway credential (or the break-glass --store-token-source env:<VAR>) resolves",
|
|
4600
|
+
"requires_consent": false,
|
|
4601
|
+
"observed_in": [],
|
|
4602
|
+
"not_observed_reason": "the gateway is unreachable offline and the fixture holds no credential; the case proves the refusal (exit 2) writes nothing"
|
|
4603
|
+
}
|
|
4604
|
+
],
|
|
4605
|
+
"effect_test": "effects: spec derive --from-store (preflight)",
|
|
4606
|
+
"test_scope": "preflight",
|
|
4607
|
+
"notes": "PREFLIGHT-PROVED: reading a store needs a live gateway and a real credential. The case proves that the credential refusal writes nothing under the target or the spec — only the lifecycle entry.",
|
|
4608
|
+
"preflight": {
|
|
4609
|
+
"may_write": [
|
|
4610
|
+
"{lifecycle-journal}"
|
|
4611
|
+
],
|
|
4612
|
+
"may_contact": []
|
|
4613
|
+
}
|
|
4614
|
+
},
|
|
4615
|
+
{
|
|
4616
|
+
"command": "spec",
|
|
4617
|
+
"subcommand": "derive",
|
|
4618
|
+
"flags": [
|
|
4619
|
+
"--write-map"
|
|
4620
|
+
],
|
|
4621
|
+
"annotations": {
|
|
4622
|
+
"readOnlyHint": false,
|
|
4623
|
+
"destructiveHint": false,
|
|
4624
|
+
"openWorldHint": true,
|
|
4625
|
+
"idempotentHint": true
|
|
4626
|
+
},
|
|
4627
|
+
"tier": "A",
|
|
4628
|
+
"writes": [
|
|
4629
|
+
{
|
|
4630
|
+
"path": "{spec}",
|
|
4631
|
+
"when": "the target repo states a field the spec does not",
|
|
4632
|
+
"observed_in": [
|
|
4633
|
+
"no_session",
|
|
4634
|
+
"ambient_session",
|
|
4635
|
+
"stale_session",
|
|
4636
|
+
"lifecycle_log",
|
|
4637
|
+
"persisted_consent"
|
|
4638
|
+
]
|
|
4639
|
+
},
|
|
4640
|
+
{
|
|
4641
|
+
"path": "{target}/.campaign-runtime/doctor-output.json",
|
|
4642
|
+
"when": "the derive invalidates the retained doctor sidecar",
|
|
4643
|
+
"observed_in": [
|
|
4644
|
+
"no_session",
|
|
4645
|
+
"ambient_session",
|
|
4646
|
+
"stale_session",
|
|
4647
|
+
"lifecycle_log",
|
|
4648
|
+
"persisted_consent"
|
|
4649
|
+
]
|
|
4650
|
+
},
|
|
4651
|
+
{
|
|
4652
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
4653
|
+
"when": "the Map write succeeds and is recorded on the report's evidence[]",
|
|
4654
|
+
"observed_in": [],
|
|
4655
|
+
"not_observed_reason": "the Map write is not reachable against a loopback stand-in"
|
|
4656
|
+
},
|
|
4657
|
+
{
|
|
4658
|
+
"path": "{lifecycle-journal}",
|
|
4659
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
4660
|
+
"observed_in": [
|
|
4661
|
+
"ambient_session",
|
|
4662
|
+
"lifecycle_log"
|
|
4663
|
+
]
|
|
4664
|
+
}
|
|
4665
|
+
],
|
|
4666
|
+
"sends": [
|
|
4667
|
+
{
|
|
4668
|
+
"destination": "{proxy-base}/api/spec/{map-id}",
|
|
4669
|
+
"what": "the saved Map read that supplies the spec_hash precondition",
|
|
4670
|
+
"when": "always under --write-map",
|
|
4671
|
+
"requires_consent": false,
|
|
4672
|
+
"observed_in": [
|
|
4673
|
+
"no_session",
|
|
4674
|
+
"ambient_session",
|
|
4675
|
+
"stale_session",
|
|
4676
|
+
"lifecycle_log",
|
|
4677
|
+
"persisted_consent"
|
|
4678
|
+
]
|
|
4679
|
+
},
|
|
4680
|
+
{
|
|
4681
|
+
"destination": "{proxy-base}/api/maps/{map-id}",
|
|
4682
|
+
"what": "PUT of the derived Campaign Cart SDK pin into the Map's Build hints, under X-Campaign-Key with the Map's spec_hash as the X-Spec-Hash precondition",
|
|
4683
|
+
"when": "the Map declares no pin or one behind the repo",
|
|
4684
|
+
"requires_consent": false,
|
|
4685
|
+
"observed_in": [],
|
|
4686
|
+
"not_observed_reason": "the loopback stand-in cannot satisfy the Map read's precondition, so the PUT is never reached"
|
|
4687
|
+
}
|
|
4688
|
+
],
|
|
4689
|
+
"effect_test": "effects: spec derive --write-map (preflight)",
|
|
4690
|
+
"test_scope": "preflight",
|
|
4691
|
+
"notes": "PREFLIGHT-PROVED for the PUT. The case proves the declared destination IS the one contacted — the loopback receiver sees the Map read at /api/spec/{map-id} — and that the refusal that follows (exit 2) adds no report evidence.",
|
|
4692
|
+
"preflight": {
|
|
4693
|
+
"may_write": [
|
|
4694
|
+
"{spec}",
|
|
4695
|
+
"{target}/.campaign-runtime/doctor-output.json",
|
|
4696
|
+
"{lifecycle-journal}"
|
|
4697
|
+
],
|
|
4698
|
+
"may_contact": [
|
|
4699
|
+
"/api/spec/{map-id}"
|
|
4700
|
+
]
|
|
4701
|
+
}
|
|
4702
|
+
},
|
|
4703
|
+
{
|
|
4704
|
+
"command": "polish",
|
|
4705
|
+
"subcommand": "capture",
|
|
4706
|
+
"flags": [],
|
|
4707
|
+
"annotations": {
|
|
4708
|
+
"readOnlyHint": false,
|
|
4709
|
+
"destructiveHint": false,
|
|
4710
|
+
"openWorldHint": true,
|
|
4711
|
+
"idempotentHint": true
|
|
4712
|
+
},
|
|
4713
|
+
"tier": "A",
|
|
4714
|
+
"writes": [
|
|
4715
|
+
{
|
|
4716
|
+
"path": "{target}/.campaign-runtime/polish/**",
|
|
4717
|
+
"when": "the capture completes — screenshots and the polish evidence bundle",
|
|
4718
|
+
"observed_in": [],
|
|
4719
|
+
"not_observed_reason": "the capture is refused before the browser is launched"
|
|
4720
|
+
},
|
|
4721
|
+
{
|
|
4722
|
+
"path": "{target}/.campaign-runtime/assembly-report.json",
|
|
4723
|
+
"when": "the capture completes and its evidence is recorded",
|
|
4724
|
+
"observed_in": [],
|
|
4725
|
+
"not_observed_reason": "the capture is refused before the browser is launched"
|
|
4726
|
+
},
|
|
4727
|
+
{
|
|
4728
|
+
"path": "{lifecycle-journal}",
|
|
4729
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
4730
|
+
"observed_in": [
|
|
4731
|
+
"ambient_session",
|
|
4732
|
+
"lifecycle_log"
|
|
4733
|
+
]
|
|
4734
|
+
}
|
|
4735
|
+
],
|
|
4736
|
+
"sends": [
|
|
4737
|
+
{
|
|
4738
|
+
"destination": "{base-url}",
|
|
4739
|
+
"what": "browser navigation and asset loads against the deployed campaign",
|
|
4740
|
+
"when": "assembly is complete and a browser is installed",
|
|
4741
|
+
"requires_consent": false,
|
|
4742
|
+
"observed_in": [],
|
|
4743
|
+
"not_observed_reason": "the capture refuses before the browser is launched, so nothing leaves"
|
|
4744
|
+
}
|
|
4745
|
+
],
|
|
4746
|
+
"effect_test": "effects: polish capture (preflight)",
|
|
4747
|
+
"test_scope": "preflight",
|
|
4748
|
+
"notes": "PREFLIGHT-PROVED: capture needs an installed browser and a reachable --base-url. The case proves the refusal (\"requires completed assembly before browser evidence collection\") writes nothing but the lifecycle entry and contacts nothing.",
|
|
4749
|
+
"preflight": {
|
|
4750
|
+
"may_write": [
|
|
4751
|
+
"{lifecycle-journal}"
|
|
4752
|
+
],
|
|
4753
|
+
"may_contact": []
|
|
4754
|
+
}
|
|
4755
|
+
},
|
|
4756
|
+
{
|
|
4757
|
+
"command": "login",
|
|
4758
|
+
"subcommand": null,
|
|
4759
|
+
"flags": [],
|
|
4760
|
+
"annotations": {
|
|
4761
|
+
"readOnlyHint": false,
|
|
4762
|
+
"destructiveHint": false,
|
|
4763
|
+
"openWorldHint": true,
|
|
4764
|
+
"idempotentHint": true
|
|
4765
|
+
},
|
|
4766
|
+
"tier": "A",
|
|
4767
|
+
"writes": [
|
|
4768
|
+
{
|
|
4769
|
+
"path": "{home}/.campaigns-os/credentials/*",
|
|
4770
|
+
"when": "the gateway login completes — the credential is written to the user credential store (the macOS keychain, or a file under the user's home)",
|
|
4771
|
+
"observed_in": [],
|
|
4772
|
+
"not_observed_reason": "the gateway is unreachable offline, so no credential is ever minted"
|
|
4773
|
+
}
|
|
4774
|
+
],
|
|
4775
|
+
"sends": [
|
|
4776
|
+
{
|
|
4777
|
+
"destination": "the campaigns-os login gateway",
|
|
4778
|
+
"what": "the browser-consent login exchange",
|
|
4779
|
+
"when": "always",
|
|
4780
|
+
"requires_consent": false,
|
|
4781
|
+
"observed_in": [],
|
|
4782
|
+
"not_observed_reason": "the gateway is unreachable offline and the exchange needs browser consent"
|
|
4783
|
+
}
|
|
4784
|
+
],
|
|
4785
|
+
"effect_test": "effects: login (preflight)",
|
|
4786
|
+
"test_scope": "preflight",
|
|
4787
|
+
"notes": "PREFLIGHT-PROVED: login needs a reachable gateway and a human at a browser. The case proves the failure path writes NOTHING — no credential, no lifecycle entry (authentication is dispatched ahead of lifecycle capture), and no session recovery.",
|
|
4788
|
+
"preflight": {
|
|
4789
|
+
"may_write": [],
|
|
4790
|
+
"may_contact": []
|
|
4791
|
+
}
|
|
4792
|
+
}
|
|
4793
|
+
]
|
|
4794
|
+
}
|