@nextcommerce/campaigns-os 1.61.0 → 1.63.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -1
- package/CHANGELOG.md +127 -0
- package/README.md +86 -438
- package/agents/claude/CLAUDE.md +9 -4
- package/agents/codex/AGENTS.md +8 -4
- package/agents/copilot/copilot-instructions.md +8 -4
- package/agents/cursor/campaigns-os.mdc +10 -4
- package/campaign-spec/README.md +7 -0
- package/campaign-spec/dist/analytics-vendors.d.ts +40 -0
- package/campaign-spec/dist/analytics-vendors.js +44 -0
- package/campaign-spec/dist/checkout-flow.d.ts +18 -0
- package/campaign-spec/dist/checkout-flow.js +28 -0
- package/campaign-spec/dist/index.d.ts +4 -2
- package/campaign-spec/dist/index.js +5 -1
- package/campaign-spec/dist/rules/analytics-contract-shape.d.ts +8 -0
- package/campaign-spec/dist/rules/analytics-contract-shape.js +39 -0
- package/campaign-spec/dist/rules/campaign-currencies.d.ts +30 -0
- package/campaign-spec/dist/rules/campaign-currencies.js +130 -0
- package/campaign-spec/dist/rules/checkout-path-has-packages.d.ts +31 -0
- package/campaign-spec/dist/rules/checkout-path-has-packages.js +79 -0
- package/campaign-spec/dist/rules/index.d.ts +3 -0
- package/campaign-spec/dist/rules/index.js +9 -0
- package/campaign-spec/dist/rules/package-currency-prices.d.ts +29 -0
- package/campaign-spec/dist/rules/package-currency-prices.js +137 -0
- package/campaign-spec/dist/types.d.ts +59 -9
- package/compatibility.json +1 -1
- package/contracts/commerce-surface-catalog.json +59 -53
- package/contracts/effects.v1.json +549 -165
- package/contracts/fixtures/runtime-recipe/accept/current.json +4 -0
- package/contracts/fixtures/runtime-recipe/accept/minimal.json +4 -0
- package/contracts/fixtures/runtime-recipe/dist-states.json +1 -1
- package/contracts/fixtures/runtime-recipe/reject/advisory-enforcement.json +4 -0
- package/contracts/fixtures/runtime-recipe/reject/allowlist-without-hosts.json +4 -0
- package/contracts/fixtures/runtime-recipe/reject/committed-output-claim.json +4 -0
- package/contracts/fixtures/runtime-recipe/reject/engines-disagreement-warns.json +4 -0
- package/contracts/fixtures/runtime-recipe/reject/lifecycle-scripts-enabled.json +4 -0
- package/contracts/fixtures/runtime-recipe/reject/unknown-kind.json +4 -0
- package/contracts/fixtures/runtime-recipe/reject/unknown-network-policy.json +4 -0
- package/contracts/fixtures/runtime-recipe/reject/unknown-output-check.json +4 -0
- package/contracts/fixtures/runtime-recipe/reject/unknown-revision.json +4 -0
- package/contracts/fixtures/runtime-recipe/reject/unknown-step-id.json +4 -0
- package/contracts/fixtures/runtime-recipe/reject/unperformable-check-skipped.json +4 -0
- package/contracts/fixtures/runtime-recipe/reject/unpinned-lockfile.json +4 -0
- package/contracts/release-ledger.json +1260 -0
- package/contracts/runtime-recipe.campaigns-os-node-v1.json +4 -0
- package/contracts/supported-surface.json +8 -8
- package/contracts/template-brand-contract.shared-commerce.v0.json +23 -1
- package/docs/build-packet.md +430 -37
- package/docs/campaign-standardization-report.md +4 -4
- package/docs/campaigns-os-build-flow.md +54 -3
- package/docs/campaignspec-authoring-examples.md +59 -4
- package/docs/design-source-package.md +18 -6
- package/docs/effects.md +17 -9
- package/docs/local-setup.md +1 -1
- package/docs/orientation-contract-reference.md +1 -1
- package/docs/polish-evidence.md +2 -0
- package/docs/progress-snapshots.md +7 -4
- package/docs/qa-and-test-orders.md +147 -1
- package/docs/readback.md +40 -5
- package/docs/runtime-readiness.md +7 -3
- package/docs/sdk-storage-compatibility.md +1 -1
- package/docs/skills-revision.md +10 -10
- package/package.json +1 -1
- package/schemas/campaign-runtime-build-context.v0.schema.json +9 -0
- package/schemas/campaign-runtime-build-packet.v0.schema.json +9 -0
- package/schemas/campaign-spec.v4.schema.json +34 -3
- package/schemas/campaign-spec.v5.schema.json +34 -3
- package/schemas/campaigns-os-readback.v2.schema.json +62 -1
- package/skills/campaign-lifecycle-orientation/SKILL.md +3 -3
- package/skills/campaign-readback-classification/SKILL.md +3 -3
- package/skills/campaign-run-evidence/SKILL.md +3 -3
- package/skills/contribution-intake/SKILL.md +3 -3
- package/skills/next-campaigns-build/SKILL.md +4 -3
- package/skills/next-campaigns-os/SKILL.md +6 -4
- package/skills/next-campaigns-os-setup/SKILL.md +5 -3
- package/skills/next-campaigns-polish/SKILL.md +5 -4
- package/skills/next-campaigns-qa/SKILL.md +7 -4
- package/skills/next-campaigns-sdk-bump/SKILL.md +42 -9
- package/skills.json +11 -11
- package/src/brand-theme.mjs +2 -1
- package/src/build-brief.mjs +4 -1
- package/src/campaign-workspace.mjs +288 -15
- package/src/change-scope.mjs +284 -0
- package/src/cli.mjs +308 -86
- package/src/commercial-journey.mjs +16 -3
- package/src/commercial-parity.mjs +15 -7
- package/src/content-residue.mjs +4 -2
- package/src/design-source-package.mjs +36 -0
- package/src/design-source-publication.mjs +9 -6
- package/src/directory-lock.mjs +73 -19
- package/src/doctor/checks.mjs +79 -7
- package/src/doctor/ci.mjs +75 -10
- package/src/doctor/inspect.mjs +23 -6
- package/src/doctor/next-step.mjs +7 -0
- package/src/doctor-sidecar.mjs +3 -2
- package/src/evidence-debt.mjs +47 -7
- package/src/finding-cause.mjs +12 -11
- package/src/input-refresh.mjs +339 -32
- package/src/invocation.mjs +7 -1
- package/src/live-campaign-refs.mjs +7 -2
- package/src/local-preview-policy.mjs +35 -2
- package/src/page-kit-analytics-vendors.mjs +132 -0
- package/src/polish-browser.mjs +3 -1
- package/src/polish-readability.mjs +221 -9
- package/src/polish-visual.mjs +9 -2
- package/src/progress-node.mjs +3 -2
- package/src/qa-analytics-parity.mjs +17 -1
- package/src/qa-browser.mjs +40 -4
- package/src/qa-commercial-parity.mjs +50 -3
- package/src/qa-node.mjs +196 -16
- package/src/qa-publish.mjs +9 -8
- package/src/qa-sidecar.mjs +16 -4
- package/src/qa-vendor-beacons.mjs +232 -0
- package/src/qa-vendor-endpoints.mjs +306 -0
- package/src/qc-accept.mjs +29 -1
- package/src/qc-check-registry.mjs +5 -1
- package/src/qc-results.mjs +73 -26
- package/src/readback.mjs +58 -10
- package/src/route-identity.mjs +10 -0
- package/src/run-record.mjs +18 -10
- package/src/runtime-state-ignore.mjs +6 -2
- package/src/sdk-storage-compatibility.mjs +21 -2
- package/src/source-html-intake.mjs +15 -1
- package/src/spec-derive-campaign.mjs +216 -0
- package/src/spec-derive.mjs +473 -53
- package/src/spec-identity.mjs +14 -0
- package/src/stage-ledger.mjs +40 -1
- package/src/stage-record.mjs +58 -13
- package/src/target-lock.mjs +11 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": "campaigns-os-effects/v1",
|
|
3
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.
|
|
4
|
+
"contract_version": "1.3.0",
|
|
5
5
|
"vocabulary": {
|
|
6
6
|
"annotations": {
|
|
7
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).",
|
|
@@ -18,8 +18,10 @@
|
|
|
18
18
|
},
|
|
19
19
|
"locations": {
|
|
20
20
|
"{target}": "The target the invocation names: the directory given to --target, or the Page Kit target repository the Build Packet points at.",
|
|
21
|
+
"{runtime}": "The funnel's runtime directory under {target}: {target}/.campaign-runtime for a Build Packet that records no assembly.runtime_dir (every packet from before per-funnel records, and the first funnel of a project), else {target}/<assembly.runtime_dir>, which prepare-build sets to .campaign-runtime/funnels/<public_route_slug> for each later funnel of the same project. The Build Context, Assembly Report, doctor output, theme output and intake inputs of a funnel live here.",
|
|
21
22
|
"{cwd}": "The working directory the invocation runs in.",
|
|
22
23
|
"{packet}": "The Build Packet the invocation names (--packet), wherever it lives — it need not be the copy inside the target repository.",
|
|
24
|
+
"{packet-runtime}": "The same funnel runtime directory beside the Build Packet: <packet directory>/.campaign-runtime, or <packet directory>/<assembly.runtime_dir> when the packet records one. The committed QA verdict sidecar and the Run Records live here.",
|
|
23
25
|
"{spec}": "The CampaignSpec file the Build Packet names (spec.local_path), which need not live inside the target repository.",
|
|
24
26
|
"{home}": "The user's machine: the home directory and the config root under it (XDG_CONFIG_HOME when set).",
|
|
25
27
|
"{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.",
|
|
@@ -58,6 +60,7 @@
|
|
|
58
60
|
"--no-write",
|
|
59
61
|
"--republish",
|
|
60
62
|
"--test-order",
|
|
63
|
+
"--vendor-beacons",
|
|
61
64
|
"--write",
|
|
62
65
|
"--write-map"
|
|
63
66
|
],
|
|
@@ -332,7 +335,7 @@
|
|
|
332
335
|
"sends": [],
|
|
333
336
|
"effect_test": "effects: a refused invocation",
|
|
334
337
|
"test_scope": "full",
|
|
335
|
-
"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."
|
|
338
|
+
"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, except when argv holds a --flag=value token, which is refused with nothing done first (its value, which can name the root or a remit control, is never read)."
|
|
336
339
|
},
|
|
337
340
|
{
|
|
338
341
|
"command": "page-kit",
|
|
@@ -360,17 +363,31 @@
|
|
|
360
363
|
"--dry-run"
|
|
361
364
|
],
|
|
362
365
|
"annotations": {
|
|
363
|
-
"readOnlyHint":
|
|
366
|
+
"readOnlyHint": false,
|
|
364
367
|
"destructiveHint": false,
|
|
365
|
-
"openWorldHint":
|
|
368
|
+
"openWorldHint": true,
|
|
366
369
|
"idempotentHint": true
|
|
367
370
|
},
|
|
368
|
-
"tier": "
|
|
371
|
+
"tier": "A",
|
|
369
372
|
"writes": [],
|
|
370
|
-
"sends": [
|
|
373
|
+
"sends": [
|
|
374
|
+
{
|
|
375
|
+
"destination": "{proxy-base}/api/campaign",
|
|
376
|
+
"what": "one GET of the live campaign (its packages, offers and shipping methods) under X-Campaign-Key, the public Campaigns API key; no request body and no Admin or store credential. The body refreshes the spec's mirrored offer and package fields (#721).",
|
|
377
|
+
"when": "the packet's built _site/<route>/ exists, a public Campaigns API key resolves from the packet, its local CampaignSpec or the declared campaign-key env var, and --no-live-refs is not given",
|
|
378
|
+
"requires_consent": false,
|
|
379
|
+
"observed_in": [
|
|
380
|
+
"no_session",
|
|
381
|
+
"ambient_session",
|
|
382
|
+
"stale_session",
|
|
383
|
+
"lifecycle_log",
|
|
384
|
+
"persisted_consent"
|
|
385
|
+
]
|
|
386
|
+
}
|
|
387
|
+
],
|
|
371
388
|
"effect_test": "effects: spec derive --dry-run",
|
|
372
389
|
"test_scope": "full",
|
|
373
|
-
"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 (the command is declared `dryRun` in src/invocation.mjs) and runs no stale-session closeout."
|
|
390
|
+
"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 (the command is declared `dryRun` in src/invocation.mjs) and runs no stale-session closeout. It makes the same one live campaign read the real invocation makes, so the diff it prints names the offer and package fields that would change; it is not readOnlyHint because of that read. --no-live-refs skips it."
|
|
374
391
|
},
|
|
375
392
|
{
|
|
376
393
|
"command": "install-skills",
|
|
@@ -813,7 +830,7 @@
|
|
|
813
830
|
]
|
|
814
831
|
},
|
|
815
832
|
{
|
|
816
|
-
"path": "{
|
|
833
|
+
"path": "{runtime}/doctor-output.json",
|
|
817
834
|
"when": "the packet edit invalidates the retained doctor sidecar",
|
|
818
835
|
"observed_in": [
|
|
819
836
|
"no_session",
|
|
@@ -824,7 +841,7 @@
|
|
|
824
841
|
]
|
|
825
842
|
},
|
|
826
843
|
{
|
|
827
|
-
"path": "{
|
|
844
|
+
"path": "{runtime}/assembly-report.json",
|
|
828
845
|
"when": "--order-path-depth is given and the report exists — the report's proof_policy mirror is refreshed through the ledger write",
|
|
829
846
|
"observed_in": [
|
|
830
847
|
"no_session",
|
|
@@ -861,13 +878,13 @@
|
|
|
861
878
|
"tier": "B",
|
|
862
879
|
"writes": [
|
|
863
880
|
{
|
|
864
|
-
"path": "{
|
|
881
|
+
"path": "{runtime}/assembly-report.json",
|
|
865
882
|
"when": "the parity render completes — stages.assembly.evidence.local_proof.production_parity is recorded",
|
|
866
883
|
"observed_in": [],
|
|
867
884
|
"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"
|
|
868
885
|
},
|
|
869
886
|
{
|
|
870
|
-
"path": "{
|
|
887
|
+
"path": "{runtime}/doctor-output.json",
|
|
871
888
|
"when": "the recorded parity verdict invalidates the retained doctor sidecar",
|
|
872
889
|
"observed_in": [],
|
|
873
890
|
"not_observed_reason": "the parity verdict the stamp follows is never recorded offline"
|
|
@@ -1027,7 +1044,7 @@
|
|
|
1027
1044
|
"tier": "A",
|
|
1028
1045
|
"writes": [
|
|
1029
1046
|
{
|
|
1030
|
-
"path": "{
|
|
1047
|
+
"path": "{runtime}/doctor-output.json",
|
|
1031
1048
|
"when": "always under --write — the doctor sidecar is (re)written",
|
|
1032
1049
|
"observed_in": [
|
|
1033
1050
|
"no_session",
|
|
@@ -1038,7 +1055,7 @@
|
|
|
1038
1055
|
]
|
|
1039
1056
|
},
|
|
1040
1057
|
{
|
|
1041
|
-
"path": "{
|
|
1058
|
+
"path": "{runtime}/assembly-report.json",
|
|
1042
1059
|
"when": "the run's doctor evidence on the assembly report changes",
|
|
1043
1060
|
"observed_in": [
|
|
1044
1061
|
"no_session",
|
|
@@ -1092,7 +1109,7 @@
|
|
|
1092
1109
|
"tier": "B",
|
|
1093
1110
|
"writes": [
|
|
1094
1111
|
{
|
|
1095
|
-
"path": "{
|
|
1112
|
+
"path": "{runtime}/doctor-output.json",
|
|
1096
1113
|
"when": "always under --write — the doctor sidecar is (re)written",
|
|
1097
1114
|
"observed_in": [
|
|
1098
1115
|
"no_session",
|
|
@@ -1103,7 +1120,7 @@
|
|
|
1103
1120
|
]
|
|
1104
1121
|
},
|
|
1105
1122
|
{
|
|
1106
|
-
"path": "{
|
|
1123
|
+
"path": "{runtime}/assembly-report.json",
|
|
1107
1124
|
"when": "the run's doctor evidence on the assembly report changes",
|
|
1108
1125
|
"observed_in": [
|
|
1109
1126
|
"no_session",
|
|
@@ -1140,7 +1157,7 @@
|
|
|
1140
1157
|
"tier": "B",
|
|
1141
1158
|
"writes": [
|
|
1142
1159
|
{
|
|
1143
|
-
"path": "{
|
|
1160
|
+
"path": "{runtime}/theme/theme-report.json",
|
|
1144
1161
|
"when": "always — the generated brand theme report is written",
|
|
1145
1162
|
"observed_in": [
|
|
1146
1163
|
"no_session",
|
|
@@ -1151,13 +1168,13 @@
|
|
|
1151
1168
|
]
|
|
1152
1169
|
},
|
|
1153
1170
|
{
|
|
1154
|
-
"path": "{
|
|
1171
|
+
"path": "{runtime}/theme/**",
|
|
1155
1172
|
"when": "the generated CSS and token files, when --out-dir is not redirected",
|
|
1156
1173
|
"observed_in": [],
|
|
1157
1174
|
"not_observed_reason": "the offline fixture's packet has no generatable brand source, so generation stops at the report"
|
|
1158
1175
|
},
|
|
1159
1176
|
{
|
|
1160
|
-
"path": "{
|
|
1177
|
+
"path": "{runtime}/doctor-output.json",
|
|
1161
1178
|
"when": "the theme decision invalidates the retained doctor sidecar",
|
|
1162
1179
|
"observed_in": [
|
|
1163
1180
|
"no_session",
|
|
@@ -1196,7 +1213,7 @@
|
|
|
1196
1213
|
"tier": "C",
|
|
1197
1214
|
"writes": [
|
|
1198
1215
|
{
|
|
1199
|
-
"path": "{
|
|
1216
|
+
"path": "{runtime}/theme/theme-report.json",
|
|
1200
1217
|
"when": "always — the generated brand theme report is written",
|
|
1201
1218
|
"observed_in": [
|
|
1202
1219
|
"no_session",
|
|
@@ -1207,13 +1224,13 @@
|
|
|
1207
1224
|
]
|
|
1208
1225
|
},
|
|
1209
1226
|
{
|
|
1210
|
-
"path": "{
|
|
1227
|
+
"path": "{runtime}/theme/**",
|
|
1211
1228
|
"when": "the generated CSS and token files, when --out-dir is not redirected",
|
|
1212
1229
|
"observed_in": [],
|
|
1213
1230
|
"not_observed_reason": "the offline fixture's packet has no generatable brand source, so generation stops at the report"
|
|
1214
1231
|
},
|
|
1215
1232
|
{
|
|
1216
|
-
"path": "{
|
|
1233
|
+
"path": "{runtime}/doctor-output.json",
|
|
1217
1234
|
"when": "the theme decision invalidates the retained doctor sidecar",
|
|
1218
1235
|
"observed_in": [
|
|
1219
1236
|
"no_session",
|
|
@@ -1261,7 +1278,7 @@
|
|
|
1261
1278
|
]
|
|
1262
1279
|
},
|
|
1263
1280
|
{
|
|
1264
|
-
"path": "{
|
|
1281
|
+
"path": "{runtime}/doctor-output.json",
|
|
1265
1282
|
"when": "the sync invalidates the retained doctor sidecar",
|
|
1266
1283
|
"observed_in": [
|
|
1267
1284
|
"no_session",
|
|
@@ -1289,6 +1306,70 @@
|
|
|
1289
1306
|
"command": "spec",
|
|
1290
1307
|
"subcommand": "derive",
|
|
1291
1308
|
"flags": [],
|
|
1309
|
+
"annotations": {
|
|
1310
|
+
"readOnlyHint": false,
|
|
1311
|
+
"destructiveHint": false,
|
|
1312
|
+
"openWorldHint": true,
|
|
1313
|
+
"idempotentHint": true
|
|
1314
|
+
},
|
|
1315
|
+
"tier": "A",
|
|
1316
|
+
"writes": [
|
|
1317
|
+
{
|
|
1318
|
+
"path": "{spec}",
|
|
1319
|
+
"when": "the target repo states a field the spec does not (SDK pin, page_url, analytics ids; after handoff, pages added to or removed from the page tree), or the live campaign states a mirrored offer or package field the spec does not",
|
|
1320
|
+
"observed_in": [
|
|
1321
|
+
"no_session",
|
|
1322
|
+
"ambient_session",
|
|
1323
|
+
"stale_session",
|
|
1324
|
+
"lifecycle_log",
|
|
1325
|
+
"persisted_consent"
|
|
1326
|
+
]
|
|
1327
|
+
},
|
|
1328
|
+
{
|
|
1329
|
+
"path": "{runtime}/doctor-output.json",
|
|
1330
|
+
"when": "the derive invalidates the retained doctor sidecar",
|
|
1331
|
+
"observed_in": [
|
|
1332
|
+
"no_session",
|
|
1333
|
+
"ambient_session",
|
|
1334
|
+
"stale_session",
|
|
1335
|
+
"lifecycle_log",
|
|
1336
|
+
"persisted_consent"
|
|
1337
|
+
]
|
|
1338
|
+
},
|
|
1339
|
+
{
|
|
1340
|
+
"path": "{lifecycle-journal}",
|
|
1341
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
1342
|
+
"observed_in": [
|
|
1343
|
+
"ambient_session",
|
|
1344
|
+
"lifecycle_log"
|
|
1345
|
+
]
|
|
1346
|
+
}
|
|
1347
|
+
],
|
|
1348
|
+
"sends": [
|
|
1349
|
+
{
|
|
1350
|
+
"destination": "{proxy-base}/api/campaign",
|
|
1351
|
+
"what": "one GET of the live campaign (its packages, offers and shipping methods) under X-Campaign-Key, the public Campaigns API key; no request body and no Admin or store credential. The body refreshes the spec's mirrored offer and package fields (#721).",
|
|
1352
|
+
"when": "the packet's built _site/<route>/ exists, a public Campaigns API key resolves from the packet, its local CampaignSpec or the declared campaign-key env var, and --no-live-refs is not given",
|
|
1353
|
+
"requires_consent": false,
|
|
1354
|
+
"observed_in": [
|
|
1355
|
+
"no_session",
|
|
1356
|
+
"ambient_session",
|
|
1357
|
+
"stale_session",
|
|
1358
|
+
"lifecycle_log",
|
|
1359
|
+
"persisted_consent"
|
|
1360
|
+
]
|
|
1361
|
+
}
|
|
1362
|
+
],
|
|
1363
|
+
"effect_test": "effects: spec derive",
|
|
1364
|
+
"test_scope": "full",
|
|
1365
|
+
"notes": "Repo-derived fields, plus the offer and package fields the spec mirrors from the Campaigns App when the live campaign is read. That read is the one doctor makes: when the packet's built _site/<route>/ exists and a public Campaigns API key resolves, one read-only GET of {proxy-base}/api/campaign under X-Campaign-Key (--proxy-base names the proxy, else the canonical one); a failed read leaves those fields as they are, with a warning. --no-live-refs skips it (its own row). 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."
|
|
1366
|
+
},
|
|
1367
|
+
{
|
|
1368
|
+
"command": "spec",
|
|
1369
|
+
"subcommand": "derive",
|
|
1370
|
+
"flags": [
|
|
1371
|
+
"--no-live-refs"
|
|
1372
|
+
],
|
|
1292
1373
|
"annotations": {
|
|
1293
1374
|
"readOnlyHint": false,
|
|
1294
1375
|
"destructiveHint": false,
|
|
@@ -1299,7 +1380,7 @@
|
|
|
1299
1380
|
"writes": [
|
|
1300
1381
|
{
|
|
1301
1382
|
"path": "{spec}",
|
|
1302
|
-
"when": "the target repo states a field the spec does not (SDK pin, page_url, analytics ids)",
|
|
1383
|
+
"when": "the target repo states a field the spec does not (SDK pin, page_url, analytics ids; after handoff, pages added to or removed from the page tree, and the routing and routing hint on each edge that names one)",
|
|
1303
1384
|
"observed_in": [
|
|
1304
1385
|
"no_session",
|
|
1305
1386
|
"ambient_session",
|
|
@@ -1309,7 +1390,7 @@
|
|
|
1309
1390
|
]
|
|
1310
1391
|
},
|
|
1311
1392
|
{
|
|
1312
|
-
"path": "{
|
|
1393
|
+
"path": "{runtime}/doctor-output.json",
|
|
1313
1394
|
"when": "the derive invalidates the retained doctor sidecar",
|
|
1314
1395
|
"observed_in": [
|
|
1315
1396
|
"no_session",
|
|
@@ -1329,9 +1410,9 @@
|
|
|
1329
1410
|
}
|
|
1330
1411
|
],
|
|
1331
1412
|
"sends": [],
|
|
1332
|
-
"effect_test": "effects: spec derive",
|
|
1413
|
+
"effect_test": "effects: spec derive --no-live-refs",
|
|
1333
1414
|
"test_scope": "full",
|
|
1334
|
-
"notes": "
|
|
1415
|
+
"notes": "The derive with the live campaign read switched off: nothing is sent even when the packet's built _site/<route>/ exists and a public Campaigns API key resolves, and the spec's offer and package fields are left as they are (the result's live_campaign records not_run with reason disabled). Everything else is the plain row."
|
|
1335
1416
|
},
|
|
1336
1417
|
{
|
|
1337
1418
|
"command": "findings",
|
|
@@ -1448,7 +1529,7 @@
|
|
|
1448
1529
|
"tier": "C",
|
|
1449
1530
|
"writes": [
|
|
1450
1531
|
{
|
|
1451
|
-
"path": "{
|
|
1532
|
+
"path": "{packet-runtime}/qa-verdict.json",
|
|
1452
1533
|
"when": "always — the named verdict is projected over the committed sidecar",
|
|
1453
1534
|
"observed_in": [
|
|
1454
1535
|
"no_session",
|
|
@@ -1690,7 +1771,7 @@
|
|
|
1690
1771
|
]
|
|
1691
1772
|
},
|
|
1692
1773
|
{
|
|
1693
|
-
"path": "{
|
|
1774
|
+
"path": "{runtime}/doctor-output.json",
|
|
1694
1775
|
"when": "the recomputed gates invalidate the retained doctor sidecar",
|
|
1695
1776
|
"observed_in": [
|
|
1696
1777
|
"no_session",
|
|
@@ -1755,7 +1836,7 @@
|
|
|
1755
1836
|
]
|
|
1756
1837
|
},
|
|
1757
1838
|
{
|
|
1758
|
-
"path": "{
|
|
1839
|
+
"path": "{runtime}/doctor-output.json",
|
|
1759
1840
|
"when": "the recomputed gates invalidate the retained doctor sidecar",
|
|
1760
1841
|
"observed_in": [
|
|
1761
1842
|
"no_session",
|
|
@@ -1820,7 +1901,7 @@
|
|
|
1820
1901
|
]
|
|
1821
1902
|
},
|
|
1822
1903
|
{
|
|
1823
|
-
"path": "{
|
|
1904
|
+
"path": "{runtime}/doctor-output.json",
|
|
1824
1905
|
"when": "the recomputed gates invalidate the retained doctor sidecar",
|
|
1825
1906
|
"observed_in": [
|
|
1826
1907
|
"no_session",
|
|
@@ -1885,7 +1966,7 @@
|
|
|
1885
1966
|
]
|
|
1886
1967
|
},
|
|
1887
1968
|
{
|
|
1888
|
-
"path": "{
|
|
1969
|
+
"path": "{runtime}/doctor-output.json",
|
|
1889
1970
|
"when": "the recomputed gates invalidate the retained doctor sidecar",
|
|
1890
1971
|
"observed_in": [
|
|
1891
1972
|
"no_session",
|
|
@@ -1950,7 +2031,7 @@
|
|
|
1950
2031
|
]
|
|
1951
2032
|
},
|
|
1952
2033
|
{
|
|
1953
|
-
"path": "{
|
|
2034
|
+
"path": "{runtime}/doctor-output.json",
|
|
1954
2035
|
"when": "the recomputed gates invalidate the retained doctor sidecar",
|
|
1955
2036
|
"observed_in": [
|
|
1956
2037
|
"no_session",
|
|
@@ -2015,7 +2096,7 @@
|
|
|
2015
2096
|
]
|
|
2016
2097
|
},
|
|
2017
2098
|
{
|
|
2018
|
-
"path": "{
|
|
2099
|
+
"path": "{runtime}/doctor-output.json",
|
|
2019
2100
|
"when": "the recomputed gates invalidate the retained doctor sidecar",
|
|
2020
2101
|
"observed_in": [
|
|
2021
2102
|
"no_session",
|
|
@@ -2082,7 +2163,7 @@
|
|
|
2082
2163
|
]
|
|
2083
2164
|
},
|
|
2084
2165
|
{
|
|
2085
|
-
"path": "{
|
|
2166
|
+
"path": "{runtime}/doctor-output.json",
|
|
2086
2167
|
"when": "the recomputed gates invalidate the retained doctor sidecar",
|
|
2087
2168
|
"observed_in": [
|
|
2088
2169
|
"no_session",
|
|
@@ -2206,7 +2287,7 @@
|
|
|
2206
2287
|
]
|
|
2207
2288
|
},
|
|
2208
2289
|
{
|
|
2209
|
-
"path": "{
|
|
2290
|
+
"path": "{packet-runtime}/qa-verdict.json",
|
|
2210
2291
|
"when": "always — the committed verdict sidecar is projected from the attempt",
|
|
2211
2292
|
"observed_in": [
|
|
2212
2293
|
"no_session",
|
|
@@ -2217,7 +2298,7 @@
|
|
|
2217
2298
|
]
|
|
2218
2299
|
},
|
|
2219
2300
|
{
|
|
2220
|
-
"path": "{
|
|
2301
|
+
"path": "{runtime}/assembly-report.json",
|
|
2221
2302
|
"when": "always — the QA stage outcome is recorded on the report",
|
|
2222
2303
|
"observed_in": [
|
|
2223
2304
|
"no_session",
|
|
@@ -2239,7 +2320,7 @@
|
|
|
2239
2320
|
]
|
|
2240
2321
|
},
|
|
2241
2322
|
{
|
|
2242
|
-
"path": "{
|
|
2323
|
+
"path": "{runtime}/doctor-output.json",
|
|
2243
2324
|
"when": "the QA outcome invalidates the retained doctor sidecar",
|
|
2244
2325
|
"observed_in": [
|
|
2245
2326
|
"no_session",
|
|
@@ -2310,7 +2391,7 @@
|
|
|
2310
2391
|
],
|
|
2311
2392
|
"effect_test": "effects: qa run",
|
|
2312
2393
|
"test_scope": "full",
|
|
2313
|
-
"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 QA stage progress observation to {proxy-base}/api/progress under persisted consent for the endpoint, and the verdict to {proxy-base}/api/qa/verdicts under the same consent unless the base URL is a local address, which keeps the verdict local by default (#486; --post-verdict still sends it). Publishing rides the telemetry consent seam rather than a flag of its own, so the four consent-off conditions saw neither request. Local-spec packets retain verdicts in the repository and never send a QA verdict or progress to the Map portal, even with --post-verdict. When a served page was read and a public Campaigns API key resolves, it also makes one read-only GET of {proxy-base}/api/campaign under X-Campaign-Key to check the served pages' shipping and package refs against the live campaign (#533); without a key or a page, or on a failed read, the verdict records the check as not_run with its reason. --no-live-refs skips that read (its own row)."
|
|
2394
|
+
"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 QA stage progress observation to {proxy-base}/api/progress under persisted consent for the endpoint, and the verdict to {proxy-base}/api/qa/verdicts under the same consent unless the base URL is a local address, which keeps the verdict local by default (#486; --post-verdict still sends it). Publishing rides the telemetry consent seam rather than a flag of its own, so the four consent-off conditions saw neither request. Local-spec packets retain verdicts in the repository and never send a QA verdict or progress to the Map portal, even with --post-verdict. When a served page was read and a public Campaigns API key resolves, it also makes one read-only GET of {proxy-base}/api/campaign under X-Campaign-Key to check the served pages' shipping and package refs against the live campaign (#533); without a key or a page, or on a failed read, the verdict records the check as not_run with its reason. --no-live-refs skips that read (its own row). --page narrows the checks to the named pages and adds no effect: when the run cannot pay the QA a page-only change owes it stops before checking any page, writing no verdict and no stage record; otherwise it writes what this row declares."
|
|
2314
2395
|
},
|
|
2315
2396
|
{
|
|
2316
2397
|
"command": "qa",
|
|
@@ -2338,7 +2419,7 @@
|
|
|
2338
2419
|
]
|
|
2339
2420
|
},
|
|
2340
2421
|
{
|
|
2341
|
-
"path": "{
|
|
2422
|
+
"path": "{packet-runtime}/qa-verdict.json",
|
|
2342
2423
|
"when": "always — the committed verdict sidecar is projected from the attempt",
|
|
2343
2424
|
"observed_in": [
|
|
2344
2425
|
"no_session",
|
|
@@ -2349,7 +2430,7 @@
|
|
|
2349
2430
|
]
|
|
2350
2431
|
},
|
|
2351
2432
|
{
|
|
2352
|
-
"path": "{
|
|
2433
|
+
"path": "{runtime}/assembly-report.json",
|
|
2353
2434
|
"when": "always — the QA stage outcome is recorded on the report",
|
|
2354
2435
|
"observed_in": [
|
|
2355
2436
|
"no_session",
|
|
@@ -2371,7 +2452,7 @@
|
|
|
2371
2452
|
]
|
|
2372
2453
|
},
|
|
2373
2454
|
{
|
|
2374
|
-
"path": "{
|
|
2455
|
+
"path": "{runtime}/doctor-output.json",
|
|
2375
2456
|
"when": "the QA outcome invalidates the retained doctor sidecar",
|
|
2376
2457
|
"observed_in": [
|
|
2377
2458
|
"no_session",
|
|
@@ -2461,7 +2542,7 @@
|
|
|
2461
2542
|
]
|
|
2462
2543
|
},
|
|
2463
2544
|
{
|
|
2464
|
-
"path": "{
|
|
2545
|
+
"path": "{packet-runtime}/qa-verdict.json",
|
|
2465
2546
|
"when": "always — the committed verdict sidecar is projected from the attempt",
|
|
2466
2547
|
"observed_in": [
|
|
2467
2548
|
"no_session",
|
|
@@ -2472,7 +2553,7 @@
|
|
|
2472
2553
|
]
|
|
2473
2554
|
},
|
|
2474
2555
|
{
|
|
2475
|
-
"path": "{
|
|
2556
|
+
"path": "{runtime}/assembly-report.json",
|
|
2476
2557
|
"when": "always — the QA stage outcome is recorded on the report",
|
|
2477
2558
|
"observed_in": [
|
|
2478
2559
|
"no_session",
|
|
@@ -2494,7 +2575,7 @@
|
|
|
2494
2575
|
]
|
|
2495
2576
|
},
|
|
2496
2577
|
{
|
|
2497
|
-
"path": "{
|
|
2578
|
+
"path": "{runtime}/doctor-output.json",
|
|
2498
2579
|
"when": "the QA outcome invalidates the retained doctor sidecar",
|
|
2499
2580
|
"observed_in": [
|
|
2500
2581
|
"no_session",
|
|
@@ -2585,7 +2666,7 @@
|
|
|
2585
2666
|
]
|
|
2586
2667
|
},
|
|
2587
2668
|
{
|
|
2588
|
-
"path": "{
|
|
2669
|
+
"path": "{packet-runtime}/qa-verdict.json",
|
|
2589
2670
|
"when": "always — the committed verdict sidecar is projected from the attempt",
|
|
2590
2671
|
"observed_in": [
|
|
2591
2672
|
"no_session",
|
|
@@ -2596,7 +2677,7 @@
|
|
|
2596
2677
|
]
|
|
2597
2678
|
},
|
|
2598
2679
|
{
|
|
2599
|
-
"path": "{
|
|
2680
|
+
"path": "{runtime}/assembly-report.json",
|
|
2600
2681
|
"when": "always — the QA stage outcome is recorded on the report",
|
|
2601
2682
|
"observed_in": [
|
|
2602
2683
|
"no_session",
|
|
@@ -2618,7 +2699,7 @@
|
|
|
2618
2699
|
]
|
|
2619
2700
|
},
|
|
2620
2701
|
{
|
|
2621
|
-
"path": "{
|
|
2702
|
+
"path": "{runtime}/doctor-output.json",
|
|
2622
2703
|
"when": "the QA outcome invalidates the retained doctor sidecar",
|
|
2623
2704
|
"observed_in": [
|
|
2624
2705
|
"no_session",
|
|
@@ -2689,7 +2770,148 @@
|
|
|
2689
2770
|
],
|
|
2690
2771
|
"effect_test": "effects: qa run --test-order",
|
|
2691
2772
|
"test_scope": "full",
|
|
2692
|
-
"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 QA stage progress observation to {proxy-base}/api/progress under persisted consent for the endpoint, and the verdict to {proxy-base}/api/qa/verdicts under the same consent unless the base URL is a local address, which keeps the verdict local by default (#486; --post-verdict still sends it). Publishing rides the telemetry consent seam rather than a flag of its own, so the four consent-off conditions saw neither request. Local-spec packets retain verdicts in the repository and never send a QA verdict or progress to the Map portal, even with --post-verdict. When a served page was read and a public Campaigns API key resolves, it also makes one read-only GET of {proxy-base}/api/campaign under X-Campaign-Key to check the served pages' shipping and package refs against the live campaign (#533); without a key or a page, or on a failed read, the verdict records the check as not_run with its reason. --no-live-refs skips that read (its own row)."
|
|
2773
|
+
"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 QA stage progress observation to {proxy-base}/api/progress under persisted consent for the endpoint, and the verdict to {proxy-base}/api/qa/verdicts under the same consent unless the base URL is a local address, which keeps the verdict local by default (#486; --post-verdict still sends it). Publishing rides the telemetry consent seam rather than a flag of its own, so the four consent-off conditions saw neither request. Local-spec packets retain verdicts in the repository and never send a QA verdict or progress to the Map portal, even with --post-verdict. When a served page was read and a public Campaigns API key resolves, it also makes one read-only GET of {proxy-base}/api/campaign under X-Campaign-Key to check the served pages' shipping and package refs against the live campaign (#533); without a key or a page, or on a failed read, the verdict records the check as not_run with its reason. --no-live-refs skips that read (its own row). Vendor beacons are held back: by default every browser context the run opens answers page requests to the listed analytics vendor beacon endpoints (GA4, Meta, TikTok, Snap, Pinterest, Taboola, Triple Whale, AppLovin Axon; the list is in docs/qa-and-test-orders.md) locally with a 204, so the test purchases never reach those vendors, and records each request on the browser-test-order:vendor-beacons verdict row as evidence. Vendor loader scripts still load from their hosts, and vendors the list does not intercept (Northbeam, and tags GTM loads for vendors outside the list) still receive what the page sends them; the row names them. --vendor-beacons live lets the listed endpoints through (its own row)."
|
|
2774
|
+
},
|
|
2775
|
+
{
|
|
2776
|
+
"command": "qa",
|
|
2777
|
+
"subcommand": "run",
|
|
2778
|
+
"flags": [
|
|
2779
|
+
"--test-order",
|
|
2780
|
+
"--vendor-beacons"
|
|
2781
|
+
],
|
|
2782
|
+
"annotations": {
|
|
2783
|
+
"readOnlyHint": false,
|
|
2784
|
+
"destructiveHint": true,
|
|
2785
|
+
"openWorldHint": true,
|
|
2786
|
+
"idempotentHint": false
|
|
2787
|
+
},
|
|
2788
|
+
"tier": "C",
|
|
2789
|
+
"writes": [
|
|
2790
|
+
{
|
|
2791
|
+
"path": "{target}/qa-output/**",
|
|
2792
|
+
"when": "always — the full verdict for the attempt is written to the qa-output tree",
|
|
2793
|
+
"observed_in": [
|
|
2794
|
+
"no_session",
|
|
2795
|
+
"ambient_session",
|
|
2796
|
+
"stale_session",
|
|
2797
|
+
"lifecycle_log",
|
|
2798
|
+
"persisted_consent"
|
|
2799
|
+
]
|
|
2800
|
+
},
|
|
2801
|
+
{
|
|
2802
|
+
"path": "{packet-runtime}/qa-verdict.json",
|
|
2803
|
+
"when": "always — the committed verdict sidecar is projected from the attempt",
|
|
2804
|
+
"observed_in": [
|
|
2805
|
+
"no_session",
|
|
2806
|
+
"ambient_session",
|
|
2807
|
+
"stale_session",
|
|
2808
|
+
"lifecycle_log",
|
|
2809
|
+
"persisted_consent"
|
|
2810
|
+
]
|
|
2811
|
+
},
|
|
2812
|
+
{
|
|
2813
|
+
"path": "{runtime}/assembly-report.json",
|
|
2814
|
+
"when": "always — the QA stage outcome is recorded on the report",
|
|
2815
|
+
"observed_in": [
|
|
2816
|
+
"no_session",
|
|
2817
|
+
"ambient_session",
|
|
2818
|
+
"stale_session",
|
|
2819
|
+
"lifecycle_log",
|
|
2820
|
+
"persisted_consent"
|
|
2821
|
+
]
|
|
2822
|
+
},
|
|
2823
|
+
{
|
|
2824
|
+
"path": "{target}/.campaign-runtime/progress/**",
|
|
2825
|
+
"when": "always — the QA stage progress snapshot is captured locally",
|
|
2826
|
+
"observed_in": [
|
|
2827
|
+
"no_session",
|
|
2828
|
+
"ambient_session",
|
|
2829
|
+
"stale_session",
|
|
2830
|
+
"lifecycle_log",
|
|
2831
|
+
"persisted_consent"
|
|
2832
|
+
]
|
|
2833
|
+
},
|
|
2834
|
+
{
|
|
2835
|
+
"path": "{runtime}/doctor-output.json",
|
|
2836
|
+
"when": "the QA outcome invalidates the retained doctor sidecar",
|
|
2837
|
+
"observed_in": [
|
|
2838
|
+
"no_session",
|
|
2839
|
+
"ambient_session",
|
|
2840
|
+
"stale_session",
|
|
2841
|
+
"lifecycle_log",
|
|
2842
|
+
"persisted_consent"
|
|
2843
|
+
]
|
|
2844
|
+
},
|
|
2845
|
+
{
|
|
2846
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
2847
|
+
"when": "an ambient run session is resolved; a blocked attempt keeps it open, a ready verdict clears it",
|
|
2848
|
+
"observed_in": [
|
|
2849
|
+
"ambient_session"
|
|
2850
|
+
]
|
|
2851
|
+
},
|
|
2852
|
+
{
|
|
2853
|
+
"path": "{lifecycle-journal}",
|
|
2854
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
2855
|
+
"observed_in": [
|
|
2856
|
+
"ambient_session",
|
|
2857
|
+
"lifecycle_log"
|
|
2858
|
+
]
|
|
2859
|
+
}
|
|
2860
|
+
],
|
|
2861
|
+
"sends": [
|
|
2862
|
+
{
|
|
2863
|
+
"destination": "{proxy-base}/api/qa/verdicts",
|
|
2864
|
+
"what": "the QA verdict for the attempt, published to the QA portal",
|
|
2865
|
+
"when": "--post-verdict is given; or, by default (no --no-post-verdict), the base URL is not a local address (localhost, *.localhost, 127.x.x.x, 0.0.0.0, [::1], an IPv4-mapped loopback) and the consent seam allows it — Run Telemetry consent on for the endpoint, or a portal-managed campaign; never for a local-spec packet",
|
|
2866
|
+
"requires_consent": true,
|
|
2867
|
+
"observed_in": [],
|
|
2868
|
+
"not_observed_reason": "the offline fixture serves the campaign from a 127.0.0.1 base URL, a local address, so the default keeps the verdict local (#486); qa publish proves this send"
|
|
2869
|
+
},
|
|
2870
|
+
{
|
|
2871
|
+
"destination": "{base-url}",
|
|
2872
|
+
"what": "HTTP requests against the campaign under test, INCLUDING order creation against the live store",
|
|
2873
|
+
"when": "always",
|
|
2874
|
+
"requires_consent": false,
|
|
2875
|
+
"observed_in": [],
|
|
2876
|
+
"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"
|
|
2877
|
+
},
|
|
2878
|
+
{
|
|
2879
|
+
"destination": "{proxy-base}/api/runs",
|
|
2880
|
+
"what": "the Run Record / progress remit envelope for this run",
|
|
2881
|
+
"when": "Run Telemetry consent is on for the endpoint and --no-remit was not given",
|
|
2882
|
+
"requires_consent": true,
|
|
2883
|
+
"observed_in": [],
|
|
2884
|
+
"not_observed_reason": "a blocked attempt assembles no Run Record, so nothing is remitted"
|
|
2885
|
+
},
|
|
2886
|
+
{
|
|
2887
|
+
"destination": "{proxy-base}/api/progress",
|
|
2888
|
+
"what": "the stage progress observation — the snapshot just captured locally, POSTed under X-Campaign-Key",
|
|
2889
|
+
"when": "Run Telemetry consent is on for the endpoint, --no-remit was not given, and the packet's campaign key resolves; never for a local-spec packet",
|
|
2890
|
+
"requires_consent": true,
|
|
2891
|
+
"observed_in": [
|
|
2892
|
+
"persisted_consent"
|
|
2893
|
+
]
|
|
2894
|
+
},
|
|
2895
|
+
{
|
|
2896
|
+
"destination": "{proxy-base}/api/campaign",
|
|
2897
|
+
"what": "one GET of the live campaign (its packages and shipping methods) under X-Campaign-Key, the public Campaigns API key; no request body and no Admin or store credential, and the read writes nothing",
|
|
2898
|
+
"when": "at least one served page was read and a public Campaigns API key resolves from the packet, the CampaignSpec or the declared campaign-key env var",
|
|
2899
|
+
"requires_consent": false,
|
|
2900
|
+
"observed_in": [],
|
|
2901
|
+
"not_observed_reason": "the offline fixture is blocked at the theme/proof gate before a served page is read, so there is no page to compare and the live campaign is not read"
|
|
2902
|
+
},
|
|
2903
|
+
{
|
|
2904
|
+
"destination": "the analytics vendor beacon endpoints listed in docs/qa-and-test-orders.md (GA4, Meta, TikTok, Snap, Pinterest, Taboola, Triple Whale, AppLovin Axon)",
|
|
2905
|
+
"what": "the page under test's own analytics requests to those vendors, test purchases included, let through as the page makes them instead of answered locally; each is still recorded on the browser-test-order:vendor-beacons verdict row",
|
|
2906
|
+
"when": "a browser test order opens a campaign page that loads one of those vendors",
|
|
2907
|
+
"requires_consent": false,
|
|
2908
|
+
"observed_in": [],
|
|
2909
|
+
"not_observed_reason": "the offline fixture is blocked before a browser opens; the vendor-beacons browser test proves a listed endpoint is let through with live and answered locally without it"
|
|
2910
|
+
}
|
|
2911
|
+
],
|
|
2912
|
+
"effect_test": "effects: qa run --test-order --vendor-beacons",
|
|
2913
|
+
"test_scope": "full",
|
|
2914
|
+
"notes": "The `qa run --test-order` row's writes and sends, plus the vendor beacons: with --vendor-beacons live no browser context is routed, so the page's requests to the listed analytics vendor endpoints reach the vendors, test purchases included. The verdict's browser-test-order:vendor-beacons row still records them, as sent. live is the only value the flag takes; any other is refused before anything runs."
|
|
2693
2915
|
},
|
|
2694
2916
|
{
|
|
2695
2917
|
"command": "qa",
|
|
@@ -2717,7 +2939,7 @@
|
|
|
2717
2939
|
]
|
|
2718
2940
|
},
|
|
2719
2941
|
{
|
|
2720
|
-
"path": "{
|
|
2942
|
+
"path": "{packet-runtime}/qa-verdict.json",
|
|
2721
2943
|
"when": "always — the committed verdict sidecar is projected from the attempt",
|
|
2722
2944
|
"observed_in": [
|
|
2723
2945
|
"no_session",
|
|
@@ -2728,7 +2950,7 @@
|
|
|
2728
2950
|
]
|
|
2729
2951
|
},
|
|
2730
2952
|
{
|
|
2731
|
-
"path": "{
|
|
2953
|
+
"path": "{runtime}/assembly-report.json",
|
|
2732
2954
|
"when": "always — the QA stage outcome is recorded on the report",
|
|
2733
2955
|
"observed_in": [
|
|
2734
2956
|
"no_session",
|
|
@@ -2750,7 +2972,7 @@
|
|
|
2750
2972
|
]
|
|
2751
2973
|
},
|
|
2752
2974
|
{
|
|
2753
|
-
"path": "{
|
|
2975
|
+
"path": "{runtime}/doctor-output.json",
|
|
2754
2976
|
"when": "the QA outcome invalidates the retained doctor sidecar",
|
|
2755
2977
|
"observed_in": [
|
|
2756
2978
|
"no_session",
|
|
@@ -2833,10 +3055,10 @@
|
|
|
2833
3055
|
"preflight": {
|
|
2834
3056
|
"may_write": [
|
|
2835
3057
|
"{target}/qa-output/**",
|
|
2836
|
-
"{
|
|
2837
|
-
"{
|
|
3058
|
+
"{packet-runtime}/qa-verdict.json",
|
|
3059
|
+
"{runtime}/assembly-report.json",
|
|
2838
3060
|
"{target}/.campaign-runtime/progress/**",
|
|
2839
|
-
"{
|
|
3061
|
+
"{runtime}/doctor-output.json",
|
|
2840
3062
|
"{target}/.campaign-runtime/run-session.json",
|
|
2841
3063
|
"{lifecycle-journal}"
|
|
2842
3064
|
],
|
|
@@ -2872,7 +3094,7 @@
|
|
|
2872
3094
|
]
|
|
2873
3095
|
},
|
|
2874
3096
|
{
|
|
2875
|
-
"path": "{
|
|
3097
|
+
"path": "{packet-runtime}/qa-verdict.json",
|
|
2876
3098
|
"when": "always — the committed verdict sidecar is projected from the attempt",
|
|
2877
3099
|
"observed_in": [
|
|
2878
3100
|
"no_session",
|
|
@@ -2883,7 +3105,7 @@
|
|
|
2883
3105
|
]
|
|
2884
3106
|
},
|
|
2885
3107
|
{
|
|
2886
|
-
"path": "{
|
|
3108
|
+
"path": "{runtime}/assembly-report.json",
|
|
2887
3109
|
"when": "always — the QA stage outcome is recorded on the report",
|
|
2888
3110
|
"observed_in": [
|
|
2889
3111
|
"no_session",
|
|
@@ -2905,7 +3127,7 @@
|
|
|
2905
3127
|
]
|
|
2906
3128
|
},
|
|
2907
3129
|
{
|
|
2908
|
-
"path": "{
|
|
3130
|
+
"path": "{runtime}/doctor-output.json",
|
|
2909
3131
|
"when": "the QA outcome invalidates the retained doctor sidecar",
|
|
2910
3132
|
"observed_in": [
|
|
2911
3133
|
"no_session",
|
|
@@ -2997,7 +3219,7 @@
|
|
|
2997
3219
|
]
|
|
2998
3220
|
},
|
|
2999
3221
|
{
|
|
3000
|
-
"path": "{
|
|
3222
|
+
"path": "{packet-runtime}/qa-verdict.json",
|
|
3001
3223
|
"when": "always — the committed verdict sidecar is projected from the attempt",
|
|
3002
3224
|
"observed_in": [
|
|
3003
3225
|
"no_session",
|
|
@@ -3008,7 +3230,7 @@
|
|
|
3008
3230
|
]
|
|
3009
3231
|
},
|
|
3010
3232
|
{
|
|
3011
|
-
"path": "{
|
|
3233
|
+
"path": "{runtime}/assembly-report.json",
|
|
3012
3234
|
"when": "always — the QA stage outcome is recorded on the report",
|
|
3013
3235
|
"observed_in": [
|
|
3014
3236
|
"no_session",
|
|
@@ -3030,7 +3252,7 @@
|
|
|
3030
3252
|
]
|
|
3031
3253
|
},
|
|
3032
3254
|
{
|
|
3033
|
-
"path": "{
|
|
3255
|
+
"path": "{runtime}/doctor-output.json",
|
|
3034
3256
|
"when": "the QA outcome invalidates the retained doctor sidecar",
|
|
3035
3257
|
"observed_in": [
|
|
3036
3258
|
"no_session",
|
|
@@ -3113,7 +3335,7 @@
|
|
|
3113
3335
|
]
|
|
3114
3336
|
},
|
|
3115
3337
|
{
|
|
3116
|
-
"path": "{
|
|
3338
|
+
"path": "{packet-runtime}/qa-verdict.json",
|
|
3117
3339
|
"when": "always — the committed verdict sidecar is projected from the attempt",
|
|
3118
3340
|
"observed_in": [
|
|
3119
3341
|
"no_session",
|
|
@@ -3124,7 +3346,7 @@
|
|
|
3124
3346
|
]
|
|
3125
3347
|
},
|
|
3126
3348
|
{
|
|
3127
|
-
"path": "{
|
|
3349
|
+
"path": "{runtime}/assembly-report.json",
|
|
3128
3350
|
"when": "always — the QA stage outcome is recorded on the report",
|
|
3129
3351
|
"observed_in": [
|
|
3130
3352
|
"no_session",
|
|
@@ -3146,7 +3368,7 @@
|
|
|
3146
3368
|
]
|
|
3147
3369
|
},
|
|
3148
3370
|
{
|
|
3149
|
-
"path": "{
|
|
3371
|
+
"path": "{runtime}/doctor-output.json",
|
|
3150
3372
|
"when": "the QA outcome invalidates the retained doctor sidecar",
|
|
3151
3373
|
"observed_in": [
|
|
3152
3374
|
"no_session",
|
|
@@ -3230,7 +3452,7 @@
|
|
|
3230
3452
|
]
|
|
3231
3453
|
},
|
|
3232
3454
|
{
|
|
3233
|
-
"path": "{
|
|
3455
|
+
"path": "{packet-runtime}/qa-verdict.json",
|
|
3234
3456
|
"when": "always — the committed verdict sidecar is projected from the attempt",
|
|
3235
3457
|
"observed_in": [
|
|
3236
3458
|
"no_session",
|
|
@@ -3241,7 +3463,7 @@
|
|
|
3241
3463
|
]
|
|
3242
3464
|
},
|
|
3243
3465
|
{
|
|
3244
|
-
"path": "{
|
|
3466
|
+
"path": "{runtime}/assembly-report.json",
|
|
3245
3467
|
"when": "always — the QA stage outcome is recorded on the report",
|
|
3246
3468
|
"observed_in": [
|
|
3247
3469
|
"no_session",
|
|
@@ -3263,7 +3485,7 @@
|
|
|
3263
3485
|
]
|
|
3264
3486
|
},
|
|
3265
3487
|
{
|
|
3266
|
-
"path": "{
|
|
3488
|
+
"path": "{runtime}/doctor-output.json",
|
|
3267
3489
|
"when": "the QA outcome invalidates the retained doctor sidecar",
|
|
3268
3490
|
"observed_in": [
|
|
3269
3491
|
"no_session",
|
|
@@ -3326,7 +3548,141 @@
|
|
|
3326
3548
|
],
|
|
3327
3549
|
"effect_test": "effects: qa run --test-order --no-live-refs",
|
|
3328
3550
|
"test_scope": "full",
|
|
3329
|
-
"notes": "The `qa run --test-order` row's writes and sends, without the {proxy-base}/api/campaign read: the verdict records the live-campaign-refs check skipped with reason disabled, never a pass. The other sends keep their own conditions and opt-outs."
|
|
3551
|
+
"notes": "The `qa run --test-order` row's writes and sends, without the {proxy-base}/api/campaign read: the verdict records the live-campaign-refs check skipped with reason disabled, never a pass. The other sends keep their own conditions and opt-outs. Vendor beacons are held back: by default every browser context the run opens answers page requests to the listed analytics vendor beacon endpoints (GA4, Meta, TikTok, Snap, Pinterest, Taboola, Triple Whale, AppLovin Axon; the list is in docs/qa-and-test-orders.md) locally with a 204, so the test purchases never reach those vendors, and records each request on the browser-test-order:vendor-beacons verdict row as evidence. Vendor loader scripts still load from their hosts, and vendors the list does not intercept (Northbeam, and tags GTM loads for vendors outside the list) still receive what the page sends them; the row names them. --vendor-beacons live lets the listed endpoints through (its own row)."
|
|
3552
|
+
},
|
|
3553
|
+
{
|
|
3554
|
+
"command": "qa",
|
|
3555
|
+
"subcommand": "run",
|
|
3556
|
+
"flags": [
|
|
3557
|
+
"--test-order",
|
|
3558
|
+
"--vendor-beacons",
|
|
3559
|
+
"--no-live-refs"
|
|
3560
|
+
],
|
|
3561
|
+
"annotations": {
|
|
3562
|
+
"readOnlyHint": false,
|
|
3563
|
+
"destructiveHint": true,
|
|
3564
|
+
"openWorldHint": true,
|
|
3565
|
+
"idempotentHint": false
|
|
3566
|
+
},
|
|
3567
|
+
"tier": "C",
|
|
3568
|
+
"writes": [
|
|
3569
|
+
{
|
|
3570
|
+
"path": "{target}/qa-output/**",
|
|
3571
|
+
"when": "always — the full verdict for the attempt is written to the qa-output tree",
|
|
3572
|
+
"observed_in": [
|
|
3573
|
+
"no_session",
|
|
3574
|
+
"ambient_session",
|
|
3575
|
+
"stale_session",
|
|
3576
|
+
"lifecycle_log",
|
|
3577
|
+
"persisted_consent"
|
|
3578
|
+
]
|
|
3579
|
+
},
|
|
3580
|
+
{
|
|
3581
|
+
"path": "{packet-runtime}/qa-verdict.json",
|
|
3582
|
+
"when": "always — the committed verdict sidecar is projected from the attempt",
|
|
3583
|
+
"observed_in": [
|
|
3584
|
+
"no_session",
|
|
3585
|
+
"ambient_session",
|
|
3586
|
+
"stale_session",
|
|
3587
|
+
"lifecycle_log",
|
|
3588
|
+
"persisted_consent"
|
|
3589
|
+
]
|
|
3590
|
+
},
|
|
3591
|
+
{
|
|
3592
|
+
"path": "{runtime}/assembly-report.json",
|
|
3593
|
+
"when": "always — the QA stage outcome is recorded on the report",
|
|
3594
|
+
"observed_in": [
|
|
3595
|
+
"no_session",
|
|
3596
|
+
"ambient_session",
|
|
3597
|
+
"stale_session",
|
|
3598
|
+
"lifecycle_log",
|
|
3599
|
+
"persisted_consent"
|
|
3600
|
+
]
|
|
3601
|
+
},
|
|
3602
|
+
{
|
|
3603
|
+
"path": "{target}/.campaign-runtime/progress/**",
|
|
3604
|
+
"when": "always — the QA stage progress snapshot is captured locally",
|
|
3605
|
+
"observed_in": [
|
|
3606
|
+
"no_session",
|
|
3607
|
+
"ambient_session",
|
|
3608
|
+
"stale_session",
|
|
3609
|
+
"lifecycle_log",
|
|
3610
|
+
"persisted_consent"
|
|
3611
|
+
]
|
|
3612
|
+
},
|
|
3613
|
+
{
|
|
3614
|
+
"path": "{runtime}/doctor-output.json",
|
|
3615
|
+
"when": "the QA outcome invalidates the retained doctor sidecar",
|
|
3616
|
+
"observed_in": [
|
|
3617
|
+
"no_session",
|
|
3618
|
+
"ambient_session",
|
|
3619
|
+
"stale_session",
|
|
3620
|
+
"lifecycle_log",
|
|
3621
|
+
"persisted_consent"
|
|
3622
|
+
]
|
|
3623
|
+
},
|
|
3624
|
+
{
|
|
3625
|
+
"path": "{target}/.campaign-runtime/run-session.json",
|
|
3626
|
+
"when": "an ambient run session is resolved; a blocked attempt keeps it open, a ready verdict clears it",
|
|
3627
|
+
"observed_in": [
|
|
3628
|
+
"ambient_session"
|
|
3629
|
+
]
|
|
3630
|
+
},
|
|
3631
|
+
{
|
|
3632
|
+
"path": "{lifecycle-journal}",
|
|
3633
|
+
"when": "a lifecycle journal is selected for the invocation — an active run session, --lifecycle-journal, or CAMPAIGNS_OS_LIFECYCLE_LOG",
|
|
3634
|
+
"observed_in": [
|
|
3635
|
+
"ambient_session",
|
|
3636
|
+
"lifecycle_log"
|
|
3637
|
+
]
|
|
3638
|
+
}
|
|
3639
|
+
],
|
|
3640
|
+
"sends": [
|
|
3641
|
+
{
|
|
3642
|
+
"destination": "{proxy-base}/api/qa/verdicts",
|
|
3643
|
+
"what": "the QA verdict for the attempt, published to the QA portal",
|
|
3644
|
+
"when": "--post-verdict is given; or, by default (no --no-post-verdict), the base URL is not a local address (localhost, *.localhost, 127.x.x.x, 0.0.0.0, [::1], an IPv4-mapped loopback) and the consent seam allows it — Run Telemetry consent on for the endpoint, or a portal-managed campaign; never for a local-spec packet",
|
|
3645
|
+
"requires_consent": true,
|
|
3646
|
+
"observed_in": [],
|
|
3647
|
+
"not_observed_reason": "the offline fixture serves the campaign from a 127.0.0.1 base URL, a local address, so the default keeps the verdict local (#486); qa publish proves this send"
|
|
3648
|
+
},
|
|
3649
|
+
{
|
|
3650
|
+
"destination": "{base-url}",
|
|
3651
|
+
"what": "HTTP requests against the campaign under test, INCLUDING order creation against the live store",
|
|
3652
|
+
"when": "always",
|
|
3653
|
+
"requires_consent": false,
|
|
3654
|
+
"observed_in": [],
|
|
3655
|
+
"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"
|
|
3656
|
+
},
|
|
3657
|
+
{
|
|
3658
|
+
"destination": "{proxy-base}/api/runs",
|
|
3659
|
+
"what": "the Run Record / progress remit envelope for this run",
|
|
3660
|
+
"when": "Run Telemetry consent is on for the endpoint and --no-remit was not given",
|
|
3661
|
+
"requires_consent": true,
|
|
3662
|
+
"observed_in": [],
|
|
3663
|
+
"not_observed_reason": "a blocked attempt assembles no Run Record, so nothing is remitted"
|
|
3664
|
+
},
|
|
3665
|
+
{
|
|
3666
|
+
"destination": "{proxy-base}/api/progress",
|
|
3667
|
+
"what": "the stage progress observation — the snapshot just captured locally, POSTed under X-Campaign-Key",
|
|
3668
|
+
"when": "Run Telemetry consent is on for the endpoint, --no-remit was not given, and the packet's campaign key resolves; never for a local-spec packet",
|
|
3669
|
+
"requires_consent": true,
|
|
3670
|
+
"observed_in": [
|
|
3671
|
+
"persisted_consent"
|
|
3672
|
+
]
|
|
3673
|
+
},
|
|
3674
|
+
{
|
|
3675
|
+
"destination": "the analytics vendor beacon endpoints listed in docs/qa-and-test-orders.md (GA4, Meta, TikTok, Snap, Pinterest, Taboola, Triple Whale, AppLovin Axon)",
|
|
3676
|
+
"what": "the page under test's own analytics requests to those vendors, test purchases included, let through as the page makes them instead of answered locally; each is still recorded on the browser-test-order:vendor-beacons verdict row",
|
|
3677
|
+
"when": "a browser test order opens a campaign page that loads one of those vendors",
|
|
3678
|
+
"requires_consent": false,
|
|
3679
|
+
"observed_in": [],
|
|
3680
|
+
"not_observed_reason": "the offline fixture is blocked before a browser opens; the vendor-beacons browser test proves a listed endpoint is let through with live and answered locally without it"
|
|
3681
|
+
}
|
|
3682
|
+
],
|
|
3683
|
+
"effect_test": "effects: qa run --test-order --vendor-beacons --no-live-refs",
|
|
3684
|
+
"test_scope": "full",
|
|
3685
|
+
"notes": "The `qa run --test-order --vendor-beacons` row's writes and sends, without the {proxy-base}/api/campaign read: the verdict records the live-campaign-refs check skipped with reason disabled, never a pass."
|
|
3330
3686
|
},
|
|
3331
3687
|
{
|
|
3332
3688
|
"command": "qa",
|
|
@@ -3355,7 +3711,7 @@
|
|
|
3355
3711
|
]
|
|
3356
3712
|
},
|
|
3357
3713
|
{
|
|
3358
|
-
"path": "{
|
|
3714
|
+
"path": "{packet-runtime}/qa-verdict.json",
|
|
3359
3715
|
"when": "always — the committed verdict sidecar is projected from the attempt",
|
|
3360
3716
|
"observed_in": [
|
|
3361
3717
|
"no_session",
|
|
@@ -3366,7 +3722,7 @@
|
|
|
3366
3722
|
]
|
|
3367
3723
|
},
|
|
3368
3724
|
{
|
|
3369
|
-
"path": "{
|
|
3725
|
+
"path": "{runtime}/assembly-report.json",
|
|
3370
3726
|
"when": "always — the QA stage outcome is recorded on the report",
|
|
3371
3727
|
"observed_in": [
|
|
3372
3728
|
"no_session",
|
|
@@ -3388,7 +3744,7 @@
|
|
|
3388
3744
|
]
|
|
3389
3745
|
},
|
|
3390
3746
|
{
|
|
3391
|
-
"path": "{
|
|
3747
|
+
"path": "{runtime}/doctor-output.json",
|
|
3392
3748
|
"when": "the QA outcome invalidates the retained doctor sidecar",
|
|
3393
3749
|
"observed_in": [
|
|
3394
3750
|
"no_session",
|
|
@@ -3463,10 +3819,10 @@
|
|
|
3463
3819
|
"preflight": {
|
|
3464
3820
|
"may_write": [
|
|
3465
3821
|
"{target}/qa-output/**",
|
|
3466
|
-
"{
|
|
3467
|
-
"{
|
|
3822
|
+
"{packet-runtime}/qa-verdict.json",
|
|
3823
|
+
"{runtime}/assembly-report.json",
|
|
3468
3824
|
"{target}/.campaign-runtime/progress/**",
|
|
3469
|
-
"{
|
|
3825
|
+
"{runtime}/doctor-output.json",
|
|
3470
3826
|
"{target}/.campaign-runtime/run-session.json",
|
|
3471
3827
|
"{lifecycle-journal}"
|
|
3472
3828
|
],
|
|
@@ -3673,7 +4029,7 @@
|
|
|
3673
4029
|
"tier": "C",
|
|
3674
4030
|
"writes": [
|
|
3675
4031
|
{
|
|
3676
|
-
"path": "{
|
|
4032
|
+
"path": "{runtime}/assembly-report.json",
|
|
3677
4033
|
"when": "always — the waiver is recorded at stages.qa.waivers[<assertion>] (reason, waived_by, waived_at) and appended to the report's evidence[]",
|
|
3678
4034
|
"observed_in": [
|
|
3679
4035
|
"no_session",
|
|
@@ -3684,7 +4040,7 @@
|
|
|
3684
4040
|
]
|
|
3685
4041
|
},
|
|
3686
4042
|
{
|
|
3687
|
-
"path": "{
|
|
4043
|
+
"path": "{runtime}/doctor-output.json",
|
|
3688
4044
|
"when": "the waiver invalidates the retained doctor sidecar — the report edit postdates the doctor snapshot",
|
|
3689
4045
|
"observed_in": [
|
|
3690
4046
|
"no_session",
|
|
@@ -3779,7 +4135,7 @@
|
|
|
3779
4135
|
"tier": "A",
|
|
3780
4136
|
"writes": [
|
|
3781
4137
|
{
|
|
3782
|
-
"path": "{
|
|
4138
|
+
"path": "{packet-runtime}/run-records/*.json",
|
|
3783
4139
|
"when": "always — the assembled Run Record is written (re-emitted in place for an existing run id)",
|
|
3784
4140
|
"observed_in": [
|
|
3785
4141
|
"no_session",
|
|
@@ -3832,7 +4188,7 @@
|
|
|
3832
4188
|
"tier": "B",
|
|
3833
4189
|
"writes": [
|
|
3834
4190
|
{
|
|
3835
|
-
"path": "{
|
|
4191
|
+
"path": "{packet-runtime}/run-records/*.json",
|
|
3836
4192
|
"when": "always — the assembled Run Record is written",
|
|
3837
4193
|
"observed_in": [
|
|
3838
4194
|
"no_session",
|
|
@@ -3889,7 +4245,7 @@
|
|
|
3889
4245
|
]
|
|
3890
4246
|
},
|
|
3891
4247
|
{
|
|
3892
|
-
"path": "{
|
|
4248
|
+
"path": "{packet-runtime}/run-records/*.json",
|
|
3893
4249
|
"when": "a STALE run session at the root the command is about to act on is closed out before argv is read",
|
|
3894
4250
|
"observed_in": [
|
|
3895
4251
|
"stale_session"
|
|
@@ -3916,7 +4272,7 @@
|
|
|
3916
4272
|
],
|
|
3917
4273
|
"effect_test": "effects: run start",
|
|
3918
4274
|
"test_scope": "full",
|
|
3919
|
-
"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."
|
|
4275
|
+
"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 (not for a --flag=value token, which skips the closeout)."
|
|
3920
4276
|
},
|
|
3921
4277
|
{
|
|
3922
4278
|
"command": "run",
|
|
@@ -3954,7 +4310,7 @@
|
|
|
3954
4310
|
]
|
|
3955
4311
|
},
|
|
3956
4312
|
{
|
|
3957
|
-
"path": "{
|
|
4313
|
+
"path": "{packet-runtime}/run-records/*.json",
|
|
3958
4314
|
"when": "a STALE run session at the root the command is about to act on is closed out before argv is read",
|
|
3959
4315
|
"observed_in": [
|
|
3960
4316
|
"stale_session"
|
|
@@ -3996,7 +4352,7 @@
|
|
|
3996
4352
|
"tier": "C",
|
|
3997
4353
|
"writes": [
|
|
3998
4354
|
{
|
|
3999
|
-
"path": "{
|
|
4355
|
+
"path": "{packet-runtime}/run-records/*.json",
|
|
4000
4356
|
"when": "a session is active (or stale) at the root — the aggregated Run Record is written",
|
|
4001
4357
|
"observed_in": [
|
|
4002
4358
|
"ambient_session",
|
|
@@ -4097,7 +4453,7 @@
|
|
|
4097
4453
|
"tier": "C",
|
|
4098
4454
|
"writes": [
|
|
4099
4455
|
{
|
|
4100
|
-
"path": "{
|
|
4456
|
+
"path": "{packet-runtime}/run-records/*.json",
|
|
4101
4457
|
"when": "a session is active (or stale) at the root — the aggregated Run Record is written",
|
|
4102
4458
|
"observed_in": [
|
|
4103
4459
|
"ambient_session",
|
|
@@ -4187,13 +4543,13 @@
|
|
|
4187
4543
|
"tier": "B",
|
|
4188
4544
|
"writes": [
|
|
4189
4545
|
{
|
|
4190
|
-
"path": "{
|
|
4546
|
+
"path": "{runtime}/assembly-report.json",
|
|
4191
4547
|
"when": "an accept is recorded — every listed result is a current accept-eligible warning that was on record before the command; the accepts are appended to qc_accepts[] and evidence[], and nothing already there is replaced",
|
|
4192
4548
|
"observed_in": [],
|
|
4193
4549
|
"not_observed_reason": "the offline fixture names a synthetic result ref that matches no current result, so its accept is refused (changed_since_handoff) before the one write; the case proves the refusal writes nothing"
|
|
4194
4550
|
},
|
|
4195
4551
|
{
|
|
4196
|
-
"path": "{
|
|
4552
|
+
"path": "{runtime}/doctor-output.json",
|
|
4197
4553
|
"when": "an accept is recorded; it marks the retained doctor sidecar stale",
|
|
4198
4554
|
"observed_in": [],
|
|
4199
4555
|
"not_observed_reason": "the offline fixture names a synthetic result ref that matches no current result, so its accept is refused (changed_since_handoff) before the one write; the case proves the refusal writes nothing"
|
|
@@ -4227,7 +4583,7 @@
|
|
|
4227
4583
|
"tier": "C",
|
|
4228
4584
|
"writes": [
|
|
4229
4585
|
{
|
|
4230
|
-
"path": "{
|
|
4586
|
+
"path": "{runtime}/assembly-report.json",
|
|
4231
4587
|
"when": "always — the waiver is recorded on the report",
|
|
4232
4588
|
"observed_in": [
|
|
4233
4589
|
"no_session",
|
|
@@ -4238,7 +4594,7 @@
|
|
|
4238
4594
|
]
|
|
4239
4595
|
},
|
|
4240
4596
|
{
|
|
4241
|
-
"path": "{
|
|
4597
|
+
"path": "{runtime}/doctor-output.json",
|
|
4242
4598
|
"when": "the waiver invalidates the retained doctor sidecar",
|
|
4243
4599
|
"observed_in": [
|
|
4244
4600
|
"no_session",
|
|
@@ -4275,7 +4631,7 @@
|
|
|
4275
4631
|
"tier": "C",
|
|
4276
4632
|
"writes": [
|
|
4277
4633
|
{
|
|
4278
|
-
"path": "{
|
|
4634
|
+
"path": "{runtime}/assembly-report.json",
|
|
4279
4635
|
"when": "always — the theme-gate waiver is recorded on the report",
|
|
4280
4636
|
"observed_in": [
|
|
4281
4637
|
"no_session",
|
|
@@ -4286,7 +4642,7 @@
|
|
|
4286
4642
|
]
|
|
4287
4643
|
},
|
|
4288
4644
|
{
|
|
4289
|
-
"path": "{
|
|
4645
|
+
"path": "{runtime}/doctor-output.json",
|
|
4290
4646
|
"when": "the waiver invalidates the retained doctor sidecar",
|
|
4291
4647
|
"observed_in": [
|
|
4292
4648
|
"no_session",
|
|
@@ -4334,7 +4690,7 @@
|
|
|
4334
4690
|
]
|
|
4335
4691
|
},
|
|
4336
4692
|
{
|
|
4337
|
-
"path": "{
|
|
4693
|
+
"path": "{runtime}/build-context.json",
|
|
4338
4694
|
"when": "always — the build context sidecar",
|
|
4339
4695
|
"observed_in": [
|
|
4340
4696
|
"no_session",
|
|
@@ -4345,7 +4701,7 @@
|
|
|
4345
4701
|
]
|
|
4346
4702
|
},
|
|
4347
4703
|
{
|
|
4348
|
-
"path": "{
|
|
4704
|
+
"path": "{runtime}/assembly-report.json",
|
|
4349
4705
|
"when": "always — the assembly report for the run",
|
|
4350
4706
|
"observed_in": [
|
|
4351
4707
|
"no_session",
|
|
@@ -4356,7 +4712,7 @@
|
|
|
4356
4712
|
]
|
|
4357
4713
|
},
|
|
4358
4714
|
{
|
|
4359
|
-
"path": "{
|
|
4715
|
+
"path": "{runtime}/input/*",
|
|
4360
4716
|
"when": "always — the normalized brief and the design source package",
|
|
4361
4717
|
"observed_in": [
|
|
4362
4718
|
"no_session",
|
|
@@ -4374,7 +4730,7 @@
|
|
|
4374
4730
|
]
|
|
4375
4731
|
},
|
|
4376
4732
|
{
|
|
4377
|
-
"path": "{
|
|
4733
|
+
"path": "{runtime}/theme/theme-report.json",
|
|
4378
4734
|
"when": "the theme policy is not off",
|
|
4379
4735
|
"observed_in": [
|
|
4380
4736
|
"no_session",
|
|
@@ -4385,7 +4741,7 @@
|
|
|
4385
4741
|
]
|
|
4386
4742
|
},
|
|
4387
4743
|
{
|
|
4388
|
-
"path": "{
|
|
4744
|
+
"path": "{runtime}/doctor-output.json",
|
|
4389
4745
|
"when": "the intake runs doctor — `start` and `build` do, `prepare-build` alone does not",
|
|
4390
4746
|
"observed_in": [
|
|
4391
4747
|
"no_session",
|
|
@@ -4427,7 +4783,7 @@
|
|
|
4427
4783
|
]
|
|
4428
4784
|
},
|
|
4429
4785
|
{
|
|
4430
|
-
"path": "{
|
|
4786
|
+
"path": "{packet-runtime}/run-records/*.json",
|
|
4431
4787
|
"when": "a STALE run session at the root the command is about to act on is closed out before argv is read",
|
|
4432
4788
|
"observed_in": [
|
|
4433
4789
|
"stale_session"
|
|
@@ -4493,7 +4849,7 @@
|
|
|
4493
4849
|
]
|
|
4494
4850
|
},
|
|
4495
4851
|
{
|
|
4496
|
-
"path": "{
|
|
4852
|
+
"path": "{runtime}/build-context.json",
|
|
4497
4853
|
"when": "always — the build context sidecar",
|
|
4498
4854
|
"observed_in": [
|
|
4499
4855
|
"no_session",
|
|
@@ -4504,7 +4860,7 @@
|
|
|
4504
4860
|
]
|
|
4505
4861
|
},
|
|
4506
4862
|
{
|
|
4507
|
-
"path": "{
|
|
4863
|
+
"path": "{runtime}/assembly-report.json",
|
|
4508
4864
|
"when": "always — the assembly report for the run",
|
|
4509
4865
|
"observed_in": [
|
|
4510
4866
|
"no_session",
|
|
@@ -4515,7 +4871,7 @@
|
|
|
4515
4871
|
]
|
|
4516
4872
|
},
|
|
4517
4873
|
{
|
|
4518
|
-
"path": "{
|
|
4874
|
+
"path": "{runtime}/input/*",
|
|
4519
4875
|
"when": "always — the normalized brief and the design source package",
|
|
4520
4876
|
"observed_in": [
|
|
4521
4877
|
"no_session",
|
|
@@ -4533,7 +4889,7 @@
|
|
|
4533
4889
|
]
|
|
4534
4890
|
},
|
|
4535
4891
|
{
|
|
4536
|
-
"path": "{
|
|
4892
|
+
"path": "{runtime}/theme/theme-report.json",
|
|
4537
4893
|
"when": "the theme policy is not off",
|
|
4538
4894
|
"observed_in": [
|
|
4539
4895
|
"no_session",
|
|
@@ -4544,7 +4900,7 @@
|
|
|
4544
4900
|
]
|
|
4545
4901
|
},
|
|
4546
4902
|
{
|
|
4547
|
-
"path": "{
|
|
4903
|
+
"path": "{runtime}/doctor-output.json",
|
|
4548
4904
|
"when": "the intake runs doctor — `start` and `build` do, `prepare-build` alone does not",
|
|
4549
4905
|
"observed_in": [
|
|
4550
4906
|
"no_session",
|
|
@@ -4586,7 +4942,7 @@
|
|
|
4586
4942
|
]
|
|
4587
4943
|
},
|
|
4588
4944
|
{
|
|
4589
|
-
"path": "{
|
|
4945
|
+
"path": "{packet-runtime}/run-records/*.json",
|
|
4590
4946
|
"when": "a STALE run session at the root the command is about to act on is closed out before argv is read",
|
|
4591
4947
|
"observed_in": [
|
|
4592
4948
|
"stale_session"
|
|
@@ -4624,7 +4980,7 @@
|
|
|
4624
4980
|
],
|
|
4625
4981
|
"effect_test": "effects: start --force",
|
|
4626
4982
|
"test_scope": "full",
|
|
4627
|
-
"notes": "DESTRUCTIVE: --force overwrites an assembly report that carries stage evidence, stage history or operator decisions, and the packet's recorded deploy target, preview URL, production URL, order-path depth and allowed-domains confirmation, printing the stage keys and the operator state it cleared. It archives completed build, Polish and QA records into stage history, which is kept, and keeps each stage's record that its inputs changed. This is the flag that makes `start` destructive; the base form refuses instead. It also regenerates a stale Design Source Package that this intake synthesized itself: the previous Assembly Report records origin \"synthesized\" and the package bytes still match it. An adopted or hand-edited package is never replaced. The declared writes already cover that path."
|
|
4983
|
+
"notes": "DESTRUCTIVE: --force overwrites an assembly report that carries stage evidence, stage history or operator decisions, and the packet's recorded deploy target, preview URL, production URL, order-path depth and allowed-domains confirmation, printing the stage keys and the operator state it cleared. It archives completed build, Polish and QA records into stage history, which is kept, and keeps each stage's record that its inputs changed. This is the flag that makes `start` destructive; the base form refuses instead. It also regenerates a stale Design Source Package that this intake synthesized itself: the previous Assembly Report records origin \"synthesized\" and the package bytes still match it. An adopted or hand-edited package is never replaced. The declared writes already cover that path. With --out naming the Build Packet of another route, it also replaces that funnel with this one (renaming its route): the packet is rewritten for this route, and when that funnel kept the project-level records they are regenerated for this route in place. Without --force that run is refused, so naming a path never replaces another funnel."
|
|
4628
4984
|
},
|
|
4629
4985
|
{
|
|
4630
4986
|
"command": "start",
|
|
@@ -4652,7 +5008,7 @@
|
|
|
4652
5008
|
]
|
|
4653
5009
|
},
|
|
4654
5010
|
{
|
|
4655
|
-
"path": "{
|
|
5011
|
+
"path": "{runtime}/build-context.json",
|
|
4656
5012
|
"when": "always — the build context sidecar",
|
|
4657
5013
|
"observed_in": [
|
|
4658
5014
|
"no_session",
|
|
@@ -4663,7 +5019,7 @@
|
|
|
4663
5019
|
]
|
|
4664
5020
|
},
|
|
4665
5021
|
{
|
|
4666
|
-
"path": "{
|
|
5022
|
+
"path": "{runtime}/assembly-report.json",
|
|
4667
5023
|
"when": "always — the assembly report for the run",
|
|
4668
5024
|
"observed_in": [
|
|
4669
5025
|
"no_session",
|
|
@@ -4674,7 +5030,7 @@
|
|
|
4674
5030
|
]
|
|
4675
5031
|
},
|
|
4676
5032
|
{
|
|
4677
|
-
"path": "{
|
|
5033
|
+
"path": "{runtime}/input/*",
|
|
4678
5034
|
"when": "always — the normalized brief and the design source package",
|
|
4679
5035
|
"observed_in": [
|
|
4680
5036
|
"no_session",
|
|
@@ -4692,7 +5048,7 @@
|
|
|
4692
5048
|
]
|
|
4693
5049
|
},
|
|
4694
5050
|
{
|
|
4695
|
-
"path": "{
|
|
5051
|
+
"path": "{runtime}/theme/theme-report.json",
|
|
4696
5052
|
"when": "the theme policy is not off",
|
|
4697
5053
|
"observed_in": [
|
|
4698
5054
|
"no_session",
|
|
@@ -4703,7 +5059,7 @@
|
|
|
4703
5059
|
]
|
|
4704
5060
|
},
|
|
4705
5061
|
{
|
|
4706
|
-
"path": "{
|
|
5062
|
+
"path": "{runtime}/doctor-output.json",
|
|
4707
5063
|
"when": "the intake runs doctor — `start` and `build` do, `prepare-build` alone does not",
|
|
4708
5064
|
"observed_in": [
|
|
4709
5065
|
"no_session",
|
|
@@ -4781,7 +5137,7 @@
|
|
|
4781
5137
|
]
|
|
4782
5138
|
},
|
|
4783
5139
|
{
|
|
4784
|
-
"path": "{
|
|
5140
|
+
"path": "{runtime}/build-context.json",
|
|
4785
5141
|
"when": "always — the build context sidecar",
|
|
4786
5142
|
"observed_in": [
|
|
4787
5143
|
"no_session",
|
|
@@ -4792,7 +5148,7 @@
|
|
|
4792
5148
|
]
|
|
4793
5149
|
},
|
|
4794
5150
|
{
|
|
4795
|
-
"path": "{
|
|
5151
|
+
"path": "{runtime}/assembly-report.json",
|
|
4796
5152
|
"when": "always — the assembly report for the run",
|
|
4797
5153
|
"observed_in": [
|
|
4798
5154
|
"no_session",
|
|
@@ -4803,7 +5159,7 @@
|
|
|
4803
5159
|
]
|
|
4804
5160
|
},
|
|
4805
5161
|
{
|
|
4806
|
-
"path": "{
|
|
5162
|
+
"path": "{runtime}/input/*",
|
|
4807
5163
|
"when": "always — the normalized brief and the design source package",
|
|
4808
5164
|
"observed_in": [
|
|
4809
5165
|
"no_session",
|
|
@@ -4821,7 +5177,7 @@
|
|
|
4821
5177
|
]
|
|
4822
5178
|
},
|
|
4823
5179
|
{
|
|
4824
|
-
"path": "{
|
|
5180
|
+
"path": "{runtime}/theme/theme-report.json",
|
|
4825
5181
|
"when": "the theme policy is not off",
|
|
4826
5182
|
"observed_in": [
|
|
4827
5183
|
"no_session",
|
|
@@ -4852,7 +5208,7 @@
|
|
|
4852
5208
|
]
|
|
4853
5209
|
},
|
|
4854
5210
|
{
|
|
4855
|
-
"path": "{
|
|
5211
|
+
"path": "{packet-runtime}/run-records/*.json",
|
|
4856
5212
|
"when": "a STALE run session at the root the command is about to act on is closed out before argv is read",
|
|
4857
5213
|
"observed_in": [
|
|
4858
5214
|
"stale_session"
|
|
@@ -4918,7 +5274,7 @@
|
|
|
4918
5274
|
]
|
|
4919
5275
|
},
|
|
4920
5276
|
{
|
|
4921
|
-
"path": "{
|
|
5277
|
+
"path": "{runtime}/build-context.json",
|
|
4922
5278
|
"when": "always — the build context sidecar",
|
|
4923
5279
|
"observed_in": [
|
|
4924
5280
|
"no_session",
|
|
@@ -4929,7 +5285,7 @@
|
|
|
4929
5285
|
]
|
|
4930
5286
|
},
|
|
4931
5287
|
{
|
|
4932
|
-
"path": "{
|
|
5288
|
+
"path": "{runtime}/assembly-report.json",
|
|
4933
5289
|
"when": "always — the assembly report for the run",
|
|
4934
5290
|
"observed_in": [
|
|
4935
5291
|
"no_session",
|
|
@@ -4940,7 +5296,7 @@
|
|
|
4940
5296
|
]
|
|
4941
5297
|
},
|
|
4942
5298
|
{
|
|
4943
|
-
"path": "{
|
|
5299
|
+
"path": "{runtime}/input/*",
|
|
4944
5300
|
"when": "always — the normalized brief and the design source package",
|
|
4945
5301
|
"observed_in": [
|
|
4946
5302
|
"no_session",
|
|
@@ -4958,7 +5314,7 @@
|
|
|
4958
5314
|
]
|
|
4959
5315
|
},
|
|
4960
5316
|
{
|
|
4961
|
-
"path": "{
|
|
5317
|
+
"path": "{runtime}/theme/theme-report.json",
|
|
4962
5318
|
"when": "the theme policy is not off",
|
|
4963
5319
|
"observed_in": [
|
|
4964
5320
|
"no_session",
|
|
@@ -5027,7 +5383,7 @@
|
|
|
5027
5383
|
]
|
|
5028
5384
|
},
|
|
5029
5385
|
{
|
|
5030
|
-
"path": "{
|
|
5386
|
+
"path": "{runtime}/build-context.json",
|
|
5031
5387
|
"when": "always — the build context sidecar",
|
|
5032
5388
|
"observed_in": [
|
|
5033
5389
|
"no_session",
|
|
@@ -5038,7 +5394,7 @@
|
|
|
5038
5394
|
]
|
|
5039
5395
|
},
|
|
5040
5396
|
{
|
|
5041
|
-
"path": "{
|
|
5397
|
+
"path": "{runtime}/assembly-report.json",
|
|
5042
5398
|
"when": "always — the assembly report for the run",
|
|
5043
5399
|
"observed_in": [
|
|
5044
5400
|
"no_session",
|
|
@@ -5049,7 +5405,7 @@
|
|
|
5049
5405
|
]
|
|
5050
5406
|
},
|
|
5051
5407
|
{
|
|
5052
|
-
"path": "{
|
|
5408
|
+
"path": "{runtime}/input/*",
|
|
5053
5409
|
"when": "always — the normalized brief and the design source package",
|
|
5054
5410
|
"observed_in": [
|
|
5055
5411
|
"no_session",
|
|
@@ -5067,7 +5423,7 @@
|
|
|
5067
5423
|
]
|
|
5068
5424
|
},
|
|
5069
5425
|
{
|
|
5070
|
-
"path": "{
|
|
5426
|
+
"path": "{runtime}/theme/theme-report.json",
|
|
5071
5427
|
"when": "the theme policy is not off",
|
|
5072
5428
|
"observed_in": [
|
|
5073
5429
|
"no_session",
|
|
@@ -5098,7 +5454,7 @@
|
|
|
5098
5454
|
]
|
|
5099
5455
|
},
|
|
5100
5456
|
{
|
|
5101
|
-
"path": "{
|
|
5457
|
+
"path": "{packet-runtime}/run-records/*.json",
|
|
5102
5458
|
"when": "a STALE run session at the root the command is about to act on is closed out before argv is read",
|
|
5103
5459
|
"observed_in": [
|
|
5104
5460
|
"stale_session"
|
|
@@ -5136,7 +5492,7 @@
|
|
|
5136
5492
|
],
|
|
5137
5493
|
"effect_test": "effects: prepare-build --force",
|
|
5138
5494
|
"test_scope": "full",
|
|
5139
|
-
"notes": "DESTRUCTIVE: --force overwrites an assembly report that carries stage evidence, stage history or operator decisions, and the packet's recorded deploy target, preview URL, production URL, order-path depth and allowed-domains confirmation, printing the stage keys and the operator state it cleared. It archives completed build, Polish and QA records into stage history, which is kept, and keeps each stage's record that its inputs changed. This is the flag that makes `prepare-build` destructive; the base form refuses instead. It also regenerates a stale Design Source Package that this intake synthesized itself: the previous Assembly Report records origin \"synthesized\" and the package bytes still match it. An adopted or hand-edited package is never replaced. The declared writes already cover that path. Everything else it writes is the base form's intake."
|
|
5495
|
+
"notes": "DESTRUCTIVE: --force overwrites an assembly report that carries stage evidence, stage history or operator decisions, and the packet's recorded deploy target, preview URL, production URL, order-path depth and allowed-domains confirmation, printing the stage keys and the operator state it cleared. It archives completed build, Polish and QA records into stage history, which is kept, and keeps each stage's record that its inputs changed. This is the flag that makes `prepare-build` destructive; the base form refuses instead. It also regenerates a stale Design Source Package that this intake synthesized itself: the previous Assembly Report records origin \"synthesized\" and the package bytes still match it. An adopted or hand-edited package is never replaced. The declared writes already cover that path. With --out naming the Build Packet of another route, it also replaces that funnel with this one (renaming its route): the packet is rewritten for this route, and when that funnel kept the project-level records they are regenerated for this route in place. Without --force that run is refused, so naming a path never replaces another funnel. Everything else it writes is the base form's intake."
|
|
5140
5496
|
},
|
|
5141
5497
|
{
|
|
5142
5498
|
"command": "build",
|
|
@@ -5162,7 +5518,7 @@
|
|
|
5162
5518
|
]
|
|
5163
5519
|
},
|
|
5164
5520
|
{
|
|
5165
|
-
"path": "{
|
|
5521
|
+
"path": "{runtime}/build-context.json",
|
|
5166
5522
|
"when": "always — the build context sidecar",
|
|
5167
5523
|
"observed_in": [
|
|
5168
5524
|
"no_session",
|
|
@@ -5173,7 +5529,7 @@
|
|
|
5173
5529
|
]
|
|
5174
5530
|
},
|
|
5175
5531
|
{
|
|
5176
|
-
"path": "{
|
|
5532
|
+
"path": "{runtime}/assembly-report.json",
|
|
5177
5533
|
"when": "always — the assembly report for the run",
|
|
5178
5534
|
"observed_in": [
|
|
5179
5535
|
"no_session",
|
|
@@ -5184,7 +5540,7 @@
|
|
|
5184
5540
|
]
|
|
5185
5541
|
},
|
|
5186
5542
|
{
|
|
5187
|
-
"path": "{
|
|
5543
|
+
"path": "{runtime}/input/*",
|
|
5188
5544
|
"when": "always — the normalized brief and the design source package",
|
|
5189
5545
|
"observed_in": [
|
|
5190
5546
|
"no_session",
|
|
@@ -5202,7 +5558,7 @@
|
|
|
5202
5558
|
]
|
|
5203
5559
|
},
|
|
5204
5560
|
{
|
|
5205
|
-
"path": "{
|
|
5561
|
+
"path": "{runtime}/theme/theme-report.json",
|
|
5206
5562
|
"when": "the theme policy is not off",
|
|
5207
5563
|
"observed_in": [
|
|
5208
5564
|
"no_session",
|
|
@@ -5213,7 +5569,7 @@
|
|
|
5213
5569
|
]
|
|
5214
5570
|
},
|
|
5215
5571
|
{
|
|
5216
|
-
"path": "{
|
|
5572
|
+
"path": "{runtime}/doctor-output.json",
|
|
5217
5573
|
"when": "the intake runs doctor — `start` and `build` do, `prepare-build` alone does not",
|
|
5218
5574
|
"observed_in": [
|
|
5219
5575
|
"no_session",
|
|
@@ -5244,7 +5600,7 @@
|
|
|
5244
5600
|
]
|
|
5245
5601
|
},
|
|
5246
5602
|
{
|
|
5247
|
-
"path": "{
|
|
5603
|
+
"path": "{packet-runtime}/run-records/*.json",
|
|
5248
5604
|
"when": "a STALE run session at the root the command is about to act on is closed out before argv is read",
|
|
5249
5605
|
"observed_in": [
|
|
5250
5606
|
"stale_session"
|
|
@@ -5310,7 +5666,7 @@
|
|
|
5310
5666
|
]
|
|
5311
5667
|
},
|
|
5312
5668
|
{
|
|
5313
|
-
"path": "{
|
|
5669
|
+
"path": "{runtime}/build-context.json",
|
|
5314
5670
|
"when": "always — the build context sidecar",
|
|
5315
5671
|
"observed_in": [
|
|
5316
5672
|
"no_session",
|
|
@@ -5321,7 +5677,7 @@
|
|
|
5321
5677
|
]
|
|
5322
5678
|
},
|
|
5323
5679
|
{
|
|
5324
|
-
"path": "{
|
|
5680
|
+
"path": "{runtime}/assembly-report.json",
|
|
5325
5681
|
"when": "always — the assembly report for the run",
|
|
5326
5682
|
"observed_in": [
|
|
5327
5683
|
"no_session",
|
|
@@ -5332,7 +5688,7 @@
|
|
|
5332
5688
|
]
|
|
5333
5689
|
},
|
|
5334
5690
|
{
|
|
5335
|
-
"path": "{
|
|
5691
|
+
"path": "{runtime}/input/*",
|
|
5336
5692
|
"when": "always — the normalized brief and the design source package",
|
|
5337
5693
|
"observed_in": [
|
|
5338
5694
|
"no_session",
|
|
@@ -5350,7 +5706,7 @@
|
|
|
5350
5706
|
]
|
|
5351
5707
|
},
|
|
5352
5708
|
{
|
|
5353
|
-
"path": "{
|
|
5709
|
+
"path": "{runtime}/theme/theme-report.json",
|
|
5354
5710
|
"when": "the theme policy is not off",
|
|
5355
5711
|
"observed_in": [
|
|
5356
5712
|
"no_session",
|
|
@@ -5361,7 +5717,7 @@
|
|
|
5361
5717
|
]
|
|
5362
5718
|
},
|
|
5363
5719
|
{
|
|
5364
|
-
"path": "{
|
|
5720
|
+
"path": "{runtime}/doctor-output.json",
|
|
5365
5721
|
"when": "the intake runs doctor — `start` and `build` do, `prepare-build` alone does not",
|
|
5366
5722
|
"observed_in": [
|
|
5367
5723
|
"no_session",
|
|
@@ -5430,7 +5786,7 @@
|
|
|
5430
5786
|
]
|
|
5431
5787
|
},
|
|
5432
5788
|
{
|
|
5433
|
-
"path": "{
|
|
5789
|
+
"path": "{runtime}/build-context.json",
|
|
5434
5790
|
"when": "always — the build context sidecar",
|
|
5435
5791
|
"observed_in": [
|
|
5436
5792
|
"no_session",
|
|
@@ -5441,7 +5797,7 @@
|
|
|
5441
5797
|
]
|
|
5442
5798
|
},
|
|
5443
5799
|
{
|
|
5444
|
-
"path": "{
|
|
5800
|
+
"path": "{runtime}/assembly-report.json",
|
|
5445
5801
|
"when": "always — the assembly report for the run",
|
|
5446
5802
|
"observed_in": [
|
|
5447
5803
|
"no_session",
|
|
@@ -5452,7 +5808,7 @@
|
|
|
5452
5808
|
]
|
|
5453
5809
|
},
|
|
5454
5810
|
{
|
|
5455
|
-
"path": "{
|
|
5811
|
+
"path": "{runtime}/input/*",
|
|
5456
5812
|
"when": "always — the normalized brief and the design source package",
|
|
5457
5813
|
"observed_in": [
|
|
5458
5814
|
"no_session",
|
|
@@ -5470,7 +5826,7 @@
|
|
|
5470
5826
|
]
|
|
5471
5827
|
},
|
|
5472
5828
|
{
|
|
5473
|
-
"path": "{
|
|
5829
|
+
"path": "{runtime}/theme/theme-report.json",
|
|
5474
5830
|
"when": "the theme policy is not off",
|
|
5475
5831
|
"observed_in": [
|
|
5476
5832
|
"no_session",
|
|
@@ -5481,7 +5837,7 @@
|
|
|
5481
5837
|
]
|
|
5482
5838
|
},
|
|
5483
5839
|
{
|
|
5484
|
-
"path": "{
|
|
5840
|
+
"path": "{runtime}/doctor-output.json",
|
|
5485
5841
|
"when": "the intake runs doctor — `start` and `build` do, `prepare-build` alone does not",
|
|
5486
5842
|
"observed_in": [
|
|
5487
5843
|
"no_session",
|
|
@@ -5512,7 +5868,7 @@
|
|
|
5512
5868
|
]
|
|
5513
5869
|
},
|
|
5514
5870
|
{
|
|
5515
|
-
"path": "{
|
|
5871
|
+
"path": "{packet-runtime}/run-records/*.json",
|
|
5516
5872
|
"when": "a STALE run session at the root the command is about to act on is closed out before argv is read",
|
|
5517
5873
|
"observed_in": [
|
|
5518
5874
|
"stale_session"
|
|
@@ -5550,7 +5906,7 @@
|
|
|
5550
5906
|
],
|
|
5551
5907
|
"effect_test": "effects: build --force",
|
|
5552
5908
|
"test_scope": "full",
|
|
5553
|
-
"notes": "DESTRUCTIVE: --force overwrites an assembly report that carries stage evidence, stage history or operator decisions, and the packet's recorded deploy target, preview URL, production URL, order-path depth and allowed-domains confirmation, printing the stage keys and the operator state it cleared. It archives completed build, Polish and QA records into stage history, which is kept, and keeps each stage's record that its inputs changed. This is the flag that makes `build` destructive; the base form refuses instead. It also regenerates a stale Design Source Package that this intake synthesized itself: the previous Assembly Report records origin \"synthesized\" and the package bytes still match it. An adopted or hand-edited package is never replaced. The declared writes already cover that path. Everything else it writes is the base form's intake."
|
|
5909
|
+
"notes": "DESTRUCTIVE: --force overwrites an assembly report that carries stage evidence, stage history or operator decisions, and the packet's recorded deploy target, preview URL, production URL, order-path depth and allowed-domains confirmation, printing the stage keys and the operator state it cleared. It archives completed build, Polish and QA records into stage history, which is kept, and keeps each stage's record that its inputs changed. This is the flag that makes `build` destructive; the base form refuses instead. It also regenerates a stale Design Source Package that this intake synthesized itself: the previous Assembly Report records origin \"synthesized\" and the package bytes still match it. An adopted or hand-edited package is never replaced. The declared writes already cover that path. With --out naming the Build Packet of another route, it also replaces that funnel with this one (renaming its route): the packet is rewritten for this route, and when that funnel kept the project-level records they are regenerated for this route in place. Without --force that run is refused, so naming a path never replaces another funnel. Everything else it writes is the base form's intake."
|
|
5554
5910
|
},
|
|
5555
5911
|
{
|
|
5556
5912
|
"command": "spec",
|
|
@@ -5589,6 +5945,14 @@
|
|
|
5589
5945
|
"requires_consent": false,
|
|
5590
5946
|
"observed_in": [],
|
|
5591
5947
|
"not_observed_reason": "the gateway is unreachable offline and the fixture holds no credential; the case proves the refusal (exit 2) writes nothing"
|
|
5948
|
+
},
|
|
5949
|
+
{
|
|
5950
|
+
"destination": "{proxy-base}/api/campaign",
|
|
5951
|
+
"what": "one GET of the live campaign (its packages, offers and shipping methods) under X-Campaign-Key, the public Campaigns API key; no request body and no Admin or store credential. The body refreshes the spec's mirrored offer and package fields (#721).",
|
|
5952
|
+
"when": "the packet's built _site/<route>/ exists, a public Campaigns API key resolves from the packet, its local CampaignSpec or the declared campaign-key env var, and --no-live-refs is not given",
|
|
5953
|
+
"requires_consent": false,
|
|
5954
|
+
"observed_in": [],
|
|
5955
|
+
"not_observed_reason": "the fixture has no built _site/, so no live campaign read is due"
|
|
5592
5956
|
}
|
|
5593
5957
|
],
|
|
5594
5958
|
"effect_test": "effects: spec derive --from-store (preflight)",
|
|
@@ -5627,7 +5991,7 @@
|
|
|
5627
5991
|
]
|
|
5628
5992
|
},
|
|
5629
5993
|
{
|
|
5630
|
-
"path": "{
|
|
5994
|
+
"path": "{runtime}/doctor-output.json",
|
|
5631
5995
|
"when": "the derive invalidates the retained doctor sidecar",
|
|
5632
5996
|
"observed_in": [
|
|
5633
5997
|
"no_session",
|
|
@@ -5638,7 +6002,7 @@
|
|
|
5638
6002
|
]
|
|
5639
6003
|
},
|
|
5640
6004
|
{
|
|
5641
|
-
"path": "{
|
|
6005
|
+
"path": "{runtime}/assembly-report.json",
|
|
5642
6006
|
"when": "the Map write succeeds and is recorded on the report's evidence[]",
|
|
5643
6007
|
"observed_in": [],
|
|
5644
6008
|
"not_observed_reason": "the Map write is not reachable against a loopback stand-in"
|
|
@@ -5673,6 +6037,14 @@
|
|
|
5673
6037
|
"requires_consent": false,
|
|
5674
6038
|
"observed_in": [],
|
|
5675
6039
|
"not_observed_reason": "the loopback stand-in cannot satisfy the Map read's precondition, so the PUT is never reached"
|
|
6040
|
+
},
|
|
6041
|
+
{
|
|
6042
|
+
"destination": "{proxy-base}/api/campaign",
|
|
6043
|
+
"what": "one GET of the live campaign (its packages, offers and shipping methods) under X-Campaign-Key, the public Campaigns API key; no request body and no Admin or store credential. The body refreshes the spec's mirrored offer and package fields (#721).",
|
|
6044
|
+
"when": "the packet's built _site/<route>/ exists, a public Campaigns API key resolves from the packet, its local CampaignSpec or the declared campaign-key env var, and --no-live-refs is not given",
|
|
6045
|
+
"requires_consent": false,
|
|
6046
|
+
"observed_in": [],
|
|
6047
|
+
"not_observed_reason": "the fixture has no built _site/, so no live campaign read is due"
|
|
5676
6048
|
}
|
|
5677
6049
|
],
|
|
5678
6050
|
"effect_test": "effects: spec derive --write-map (preflight)",
|
|
@@ -5681,7 +6053,7 @@
|
|
|
5681
6053
|
"preflight": {
|
|
5682
6054
|
"may_write": [
|
|
5683
6055
|
"{spec}",
|
|
5684
|
-
"{
|
|
6056
|
+
"{runtime}/doctor-output.json",
|
|
5685
6057
|
"{lifecycle-journal}"
|
|
5686
6058
|
],
|
|
5687
6059
|
"may_contact": [
|
|
@@ -5708,7 +6080,7 @@
|
|
|
5708
6080
|
"not_observed_reason": "the capture is refused before the browser is launched"
|
|
5709
6081
|
},
|
|
5710
6082
|
{
|
|
5711
|
-
"path": "{
|
|
6083
|
+
"path": "{runtime}/assembly-report.json",
|
|
5712
6084
|
"when": "the capture completes and its evidence is recorded",
|
|
5713
6085
|
"observed_in": [],
|
|
5714
6086
|
"not_observed_reason": "the capture is refused before the browser is launched"
|
|
@@ -5766,7 +6138,7 @@
|
|
|
5766
6138
|
]
|
|
5767
6139
|
},
|
|
5768
6140
|
{
|
|
5769
|
-
"path": "{
|
|
6141
|
+
"path": "{runtime}/input/*",
|
|
5770
6142
|
"when": "the save changes the brief (outcome saved or saved_with_invalidation) — the normalized brief, re-derived from the saved brief file",
|
|
5771
6143
|
"observed_in": [
|
|
5772
6144
|
"no_session",
|
|
@@ -5777,7 +6149,7 @@
|
|
|
5777
6149
|
]
|
|
5778
6150
|
},
|
|
5779
6151
|
{
|
|
5780
|
-
"path": "{
|
|
6152
|
+
"path": "{runtime}/build-context.json",
|
|
5781
6153
|
"when": "the save changes the brief (outcome saved or saved_with_invalidation) — the brief summary, its bindings and the brief's prompts",
|
|
5782
6154
|
"observed_in": [
|
|
5783
6155
|
"no_session",
|
|
@@ -5788,7 +6160,7 @@
|
|
|
5788
6160
|
]
|
|
5789
6161
|
},
|
|
5790
6162
|
{
|
|
5791
|
-
"path": "{
|
|
6163
|
+
"path": "{runtime}/assembly-report.json",
|
|
5792
6164
|
"when": "the save changes the brief (outcome saved or saved_with_invalidation) — the brief summary and bindings, and stages.prepare_build re-derived from the brief's blockers; on a material change (saved_with_invalidation) build, Polish and QA become required (QA alone when only qa_policy changed), each recording input_change and keeping the record it replaced in its history, and evidence[] gains a line",
|
|
5793
6165
|
"observed_in": [
|
|
5794
6166
|
"no_session",
|
|
@@ -5799,7 +6171,7 @@
|
|
|
5799
6171
|
]
|
|
5800
6172
|
},
|
|
5801
6173
|
{
|
|
5802
|
-
"path": "{
|
|
6174
|
+
"path": "{runtime}/doctor-output.json",
|
|
5803
6175
|
"when": "a save changes the brief (outcome saved or saved_with_invalidation) and a retained doctor sidecar exists — the write postdates the doctor snapshot, so it is stamped stale",
|
|
5804
6176
|
"observed_in": [
|
|
5805
6177
|
"no_session",
|
|
@@ -5855,7 +6227,7 @@
|
|
|
5855
6227
|
"tier": "C",
|
|
5856
6228
|
"writes": [
|
|
5857
6229
|
{
|
|
5858
|
-
"path": "{
|
|
6230
|
+
"path": "{runtime}/input/*",
|
|
5859
6231
|
"when": "the refresh runs (outcome refreshed) and the brief re-derived from the brief file last saved by intake or `record brief` (or from the generated draft) differs from what is bound, or the normalized brief on disk no longer holds the re-derived brief's material — the normalized brief",
|
|
5860
6232
|
"observed_in": [
|
|
5861
6233
|
"no_session",
|
|
@@ -5866,8 +6238,20 @@
|
|
|
5866
6238
|
]
|
|
5867
6239
|
},
|
|
5868
6240
|
{
|
|
5869
|
-
"path": "{
|
|
5870
|
-
"when": "the
|
|
6241
|
+
"path": "{packet}",
|
|
6242
|
+
"when": "the active pages changed in a way record spec binds (#531, #721): a move of routes alone, or on a handed-off campaign (deploy or QA completed) a page added or removed — source_html.pages[].page_kit re-projected for every page, an added page recorded with origin repo, a removed page's entry dropped, and design_source_package's sha256 and material_fingerprint when the package is rewritten; also, without a page rebind, design_source_package alone when an earlier record spec stopped after rewriting the package and its pending provenance record vouches for the bytes on disk",
|
|
6243
|
+
"observed_in": [],
|
|
6244
|
+
"not_observed_reason": "the effects seed changes a package qty, not the active pages, so no page rebind is due"
|
|
6245
|
+
},
|
|
6246
|
+
{
|
|
6247
|
+
"path": "{runtime}/input/design-source-package.json",
|
|
6248
|
+
"when": "that page rebind changes a kept page's Surface Identity (its route, page-kit target or label) — the package prepare-build synthesized is rewritten at the same path, written first, with a pending provenance record beside it until the report records its new sha256",
|
|
6249
|
+
"observed_in": [],
|
|
6250
|
+
"not_observed_reason": "the effects seed changes a package qty, not the active pages, so no page rebind is due"
|
|
6251
|
+
},
|
|
6252
|
+
{
|
|
6253
|
+
"path": "{runtime}/build-context.json",
|
|
6254
|
+
"when": "the refresh runs (outcome refreshed) — spec.hash, spec.material_hash, spec.route_masked_material_hash and the active pages' labels; the brief summary and bindings when the re-derived brief is saved; on a page rebind, spec.active_pages, page_map and design_source_package too; design_source_package when an interrupted earlier run left it naming the old package",
|
|
5871
6255
|
"observed_in": [
|
|
5872
6256
|
"no_session",
|
|
5873
6257
|
"ambient_session",
|
|
@@ -5877,8 +6261,8 @@
|
|
|
5877
6261
|
]
|
|
5878
6262
|
},
|
|
5879
6263
|
{
|
|
5880
|
-
"path": "{
|
|
5881
|
-
"when": "the refresh runs (outcome refreshed) — identity.spec_hash and identity.spec_material_hash become the CampaignSpec's; each build, Polish and QA record made against other CampaignSpec or brief content becomes required, recording input_change and keeping the record it replaced in its history; evidence[] gains a line",
|
|
6264
|
+
"path": "{runtime}/assembly-report.json",
|
|
6265
|
+
"when": "the refresh runs (outcome refreshed) — identity.spec_hash and identity.spec_material_hash become the CampaignSpec's; each build, Polish and QA record made against other CampaignSpec or brief content becomes required, recording input_change and keeping the record it replaced in its history (on a page rebind that moved nothing the build wrote, each is restamped instead; when the set of built pages changes, a completed deploy recorded without a build fingerprint becomes required too; design_source_package when an interrupted earlier run left it naming the old package); evidence[] gains a line",
|
|
5882
6266
|
"observed_in": [
|
|
5883
6267
|
"no_session",
|
|
5884
6268
|
"ambient_session",
|
|
@@ -5888,7 +6272,7 @@
|
|
|
5888
6272
|
]
|
|
5889
6273
|
},
|
|
5890
6274
|
{
|
|
5891
|
-
"path": "{
|
|
6275
|
+
"path": "{runtime}/doctor-output.json",
|
|
5892
6276
|
"when": "a refresh runs (outcome refreshed) and a retained doctor sidecar exists — the write postdates the doctor snapshot, so it is stamped stale",
|
|
5893
6277
|
"observed_in": [
|
|
5894
6278
|
"no_session",
|
|
@@ -5910,7 +6294,7 @@
|
|
|
5910
6294
|
"sends": [],
|
|
5911
6295
|
"effect_test": "effects: record spec",
|
|
5912
6296
|
"test_scope": "full",
|
|
5913
|
-
"notes": "Destructive: build, Polish and QA records made against earlier CampaignSpec or brief content become owed again, each moving to that stage's history, which keeps the last five per stage and is never used as current proof. Waivers, warning accepts, the applied theme and deploy settings are kept. Idempotent: a repeat reads unchanged. When the bound CampaignSpec material is the spec's and no stage's recorded CampaignSpec or brief content differs from the current inputs it reads unchanged and writes nothing but the lifecycle entry. The Build Packet is read,
|
|
6297
|
+
"notes": "Destructive: build, Polish and QA records made against earlier CampaignSpec or brief content become owed again, each moving to that stage's history, which keeps the last five per stage and is never used as current proof. Waivers, warning accepts, the applied theme and deploy settings are kept. Idempotent: a repeat reads unchanged. When the bound CampaignSpec material is the spec's and no stage's recorded CampaignSpec or brief content differs from the current inputs it reads unchanged and writes nothing but the lifecycle entry. The Build Packet is read, and written only on a page rebind (a move of routes alone, or after handoff a page added or removed), which also rewrites the Design Source Package prepare-build synthesized; the brief is re-read from the brief file last saved by intake or `record brief`, never rediscovered. For a saved-Map or gateway packet it compares the copy intake fetched and sends nothing. Refused, writing nothing but the lifecycle entry, when the CampaignSpec cannot be read as a JSON object, names another campaign (local_spec_id or map_id) than the Build Packet or the Assembly Report binds, or its active pages are in another order, or a page was added or removed before handoff (those need intake), or a page rebind would move the route root or slug, leave a routing hint stale, put two pages on one page-kit target, or rewrite a Design Source Package prepare-build did not synthesize or that was edited since, or when that brief file is over 1 MiB or names more than 512 design_authority entries, names a file Campaigns OS writes itself, or is missing or not a readable regular file."
|
|
5914
6298
|
},
|
|
5915
6299
|
{
|
|
5916
6300
|
"command": "record",
|
|
@@ -5944,7 +6328,7 @@
|
|
|
5944
6328
|
"tier": "C",
|
|
5945
6329
|
"writes": [
|
|
5946
6330
|
{
|
|
5947
|
-
"path": "{
|
|
6331
|
+
"path": "{runtime}/build-context.json",
|
|
5948
6332
|
"when": "the record passes every check — scaffold.required becomes false (handoff to build)",
|
|
5949
6333
|
"observed_in": [
|
|
5950
6334
|
"no_session",
|
|
@@ -5955,7 +6339,7 @@
|
|
|
5955
6339
|
]
|
|
5956
6340
|
},
|
|
5957
6341
|
{
|
|
5958
|
-
"path": "{
|
|
6342
|
+
"path": "{runtime}/assembly-report.json",
|
|
5959
6343
|
"when": "the record passes every check — stages.setup becomes completed",
|
|
5960
6344
|
"observed_in": [
|
|
5961
6345
|
"no_session",
|
|
@@ -5966,7 +6350,7 @@
|
|
|
5966
6350
|
]
|
|
5967
6351
|
},
|
|
5968
6352
|
{
|
|
5969
|
-
"path": "{
|
|
6353
|
+
"path": "{runtime}/doctor-output.json",
|
|
5970
6354
|
"when": "a retained doctor sidecar exists — the record postdates the doctor snapshot, so it is stamped stale",
|
|
5971
6355
|
"observed_in": [
|
|
5972
6356
|
"no_session",
|
|
@@ -6022,7 +6406,7 @@
|
|
|
6022
6406
|
"tier": "C",
|
|
6023
6407
|
"writes": [
|
|
6024
6408
|
{
|
|
6025
|
-
"path": "{
|
|
6409
|
+
"path": "{runtime}/assembly-report.json",
|
|
6026
6410
|
"when": "the record passes every check — stages.assembly becomes completed with build_fingerprint set to doctor's derived.build_output_fingerprint.value and the brief and CampaignSpec content it was made against, keeping the record it replaced in its history. When the replaced completed record was made against other brief or CampaignSpec content, the record writes input_change and stages.polish and stages.qa become required; otherwise stages.polish becomes required unless its evidence is bound to that exact output. Output identical to the build that change superseded keeps input_change, unless --deviation-reason records the operator's reason (status completed_with_warnings)",
|
|
6027
6411
|
"observed_in": [
|
|
6028
6412
|
"no_session",
|
|
@@ -6033,7 +6417,7 @@
|
|
|
6033
6417
|
]
|
|
6034
6418
|
},
|
|
6035
6419
|
{
|
|
6036
|
-
"path": "{
|
|
6420
|
+
"path": "{runtime}/doctor-output.json",
|
|
6037
6421
|
"when": "a retained doctor sidecar exists — the record postdates the doctor snapshot, so it is stamped stale",
|
|
6038
6422
|
"observed_in": [
|
|
6039
6423
|
"no_session",
|
|
@@ -6089,7 +6473,7 @@
|
|
|
6089
6473
|
"tier": "C",
|
|
6090
6474
|
"writes": [
|
|
6091
6475
|
{
|
|
6092
|
-
"path": "{
|
|
6476
|
+
"path": "{runtime}/assembly-report.json",
|
|
6093
6477
|
"when": "the record passes every check — stages.polish becomes the file's status (completed, blocked with blockers, or skipped with skip_reason) and evidence, bound to doctor's current fingerprint and, for a completed status, the brief and CampaignSpec content it was made against, keeping the record it replaced in its history; theme.repair_loop_defect when the file sets it",
|
|
6094
6478
|
"observed_in": [
|
|
6095
6479
|
"no_session",
|
|
@@ -6100,7 +6484,7 @@
|
|
|
6100
6484
|
]
|
|
6101
6485
|
},
|
|
6102
6486
|
{
|
|
6103
|
-
"path": "{
|
|
6487
|
+
"path": "{runtime}/doctor-output.json",
|
|
6104
6488
|
"when": "a retained doctor sidecar exists — the record postdates the doctor snapshot, so it is stamped stale",
|
|
6105
6489
|
"observed_in": [
|
|
6106
6490
|
"no_session",
|
|
@@ -6156,7 +6540,7 @@
|
|
|
6156
6540
|
"tier": "C",
|
|
6157
6541
|
"writes": [
|
|
6158
6542
|
{
|
|
6159
|
-
"path": "{
|
|
6543
|
+
"path": "{runtime}/assembly-report.json",
|
|
6160
6544
|
"when": "the record passes every check — theme.status becomes applied with load_order after-next-core, css_path, commerce_pages and per-page evidence read from the built pages; any earlier theme waiver is cleared",
|
|
6161
6545
|
"observed_in": [
|
|
6162
6546
|
"no_session",
|
|
@@ -6167,7 +6551,7 @@
|
|
|
6167
6551
|
]
|
|
6168
6552
|
},
|
|
6169
6553
|
{
|
|
6170
|
-
"path": "{
|
|
6554
|
+
"path": "{runtime}/doctor-output.json",
|
|
6171
6555
|
"when": "a retained doctor sidecar exists — the record postdates the doctor snapshot, so it is stamped stale",
|
|
6172
6556
|
"observed_in": [
|
|
6173
6557
|
"no_session",
|
|
@@ -6234,7 +6618,7 @@
|
|
|
6234
6618
|
]
|
|
6235
6619
|
},
|
|
6236
6620
|
{
|
|
6237
|
-
"path": "{
|
|
6621
|
+
"path": "{runtime}/assembly-report.json",
|
|
6238
6622
|
"when": "the record passes every check — stages.deploy becomes completed with the served URL in outputs and one evidence line per page that answered",
|
|
6239
6623
|
"observed_in": [
|
|
6240
6624
|
"no_session",
|
|
@@ -6245,7 +6629,7 @@
|
|
|
6245
6629
|
]
|
|
6246
6630
|
},
|
|
6247
6631
|
{
|
|
6248
|
-
"path": "{
|
|
6632
|
+
"path": "{runtime}/doctor-output.json",
|
|
6249
6633
|
"when": "a retained doctor sidecar exists — the record postdates the doctor snapshot, so it is stamped stale",
|
|
6250
6634
|
"observed_in": [
|
|
6251
6635
|
"no_session",
|