@nextcommerce/campaigns-os 1.33.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.
Files changed (310) hide show
  1. package/AGENTS.md +204 -0
  2. package/CHANGELOG.md +5002 -0
  3. package/CONTEXT.md +685 -0
  4. package/LICENSE +202 -0
  5. package/NOTICE +4 -0
  6. package/README.md +368 -0
  7. package/agents/claude/CLAUDE.md +32 -0
  8. package/agents/codex/AGENTS.md +27 -0
  9. package/agents/copilot/copilot-instructions.md +14 -0
  10. package/agents/cursor/campaigns-os.mdc +13 -0
  11. package/bin/campaigns-os.mjs +38 -0
  12. package/campaign-spec/README.md +138 -0
  13. package/campaign-spec/dist/analytics-vocabulary.d.ts +47 -0
  14. package/campaign-spec/dist/analytics-vocabulary.js +74 -0
  15. package/campaign-spec/dist/index.d.ts +40 -0
  16. package/campaign-spec/dist/index.js +77 -0
  17. package/campaign-spec/dist/normalize.d.ts +22 -0
  18. package/campaign-spec/dist/normalize.js +41 -0
  19. package/campaign-spec/dist/routing.d.ts +190 -0
  20. package/campaign-spec/dist/routing.js +263 -0
  21. package/campaign-spec/dist/rules/analytics-contract-shape.d.ts +42 -0
  22. package/campaign-spec/dist/rules/analytics-contract-shape.js +303 -0
  23. package/campaign-spec/dist/rules/assembly-hints-shape.d.ts +42 -0
  24. package/campaign-spec/dist/rules/assembly-hints-shape.js +191 -0
  25. package/campaign-spec/dist/rules/campaign-metadata.d.ts +14 -0
  26. package/campaign-spec/dist/rules/campaign-metadata.js +40 -0
  27. package/campaign-spec/dist/rules/checkout-has-success-url.d.ts +31 -0
  28. package/campaign-spec/dist/rules/checkout-has-success-url.js +66 -0
  29. package/campaign-spec/dist/rules/cycle-detection.d.ts +12 -0
  30. package/campaign-spec/dist/rules/cycle-detection.js +141 -0
  31. package/campaign-spec/dist/rules/design-source-shape.d.ts +29 -0
  32. package/campaign-spec/dist/rules/design-source-shape.js +142 -0
  33. package/campaign-spec/dist/rules/downsell-without-upsell.d.ts +11 -0
  34. package/campaign-spec/dist/rules/downsell-without-upsell.js +40 -0
  35. package/campaign-spec/dist/rules/exit-intent-validation.d.ts +23 -0
  36. package/campaign-spec/dist/rules/exit-intent-validation.js +147 -0
  37. package/campaign-spec/dist/rules/funnel-count.d.ts +9 -0
  38. package/campaign-spec/dist/rules/funnel-count.js +37 -0
  39. package/campaign-spec/dist/rules/funnel-hypothesis-length.d.ts +22 -0
  40. package/campaign-spec/dist/rules/funnel-hypothesis-length.js +60 -0
  41. package/campaign-spec/dist/rules/funnel-identity.d.ts +15 -0
  42. package/campaign-spec/dist/rules/funnel-identity.js +57 -0
  43. package/campaign-spec/dist/rules/funnel-weight-sum.d.ts +20 -0
  44. package/campaign-spec/dist/rules/funnel-weight-sum.js +66 -0
  45. package/campaign-spec/dist/rules/index.d.ts +69 -0
  46. package/campaign-spec/dist/rules/index.js +131 -0
  47. package/campaign-spec/dist/rules/offer-ref-integrity.d.ts +13 -0
  48. package/campaign-spec/dist/rules/offer-ref-integrity.js +59 -0
  49. package/campaign-spec/dist/rules/package-pricing-sanity.d.ts +12 -0
  50. package/campaign-spec/dist/rules/package-pricing-sanity.js +42 -0
  51. package/campaign-spec/dist/rules/page-count.d.ts +11 -0
  52. package/campaign-spec/dist/rules/page-count.js +31 -0
  53. package/campaign-spec/dist/rules/page-id-uniqueness.d.ts +14 -0
  54. package/campaign-spec/dist/rules/page-id-uniqueness.js +47 -0
  55. package/campaign-spec/dist/rules/promo-code-input-validation.d.ts +8 -0
  56. package/campaign-spec/dist/rules/promo-code-input-validation.js +126 -0
  57. package/campaign-spec/dist/rules/promo-codes-shape.d.ts +30 -0
  58. package/campaign-spec/dist/rules/promo-codes-shape.js +187 -0
  59. package/campaign-spec/dist/rules/route-field-ignored-for-page-type.d.ts +33 -0
  60. package/campaign-spec/dist/rules/route-field-ignored-for-page-type.js +81 -0
  61. package/campaign-spec/dist/rules/route-target-resolves.d.ts +32 -0
  62. package/campaign-spec/dist/rules/route-target-resolves.js +112 -0
  63. package/campaign-spec/dist/rules/schema-version.d.ts +21 -0
  64. package/campaign-spec/dist/rules/schema-version.js +53 -0
  65. package/campaign-spec/dist/rules/sdk-version.d.ts +26 -0
  66. package/campaign-spec/dist/rules/sdk-version.js +96 -0
  67. package/campaign-spec/dist/rules/shipping-countries-shape.d.ts +10 -0
  68. package/campaign-spec/dist/rules/shipping-countries-shape.js +30 -0
  69. package/campaign-spec/dist/rules/shipping-methods-present.d.ts +10 -0
  70. package/campaign-spec/dist/rules/shipping-methods-present.js +26 -0
  71. package/campaign-spec/dist/rules/store-profile-shape.d.ts +30 -0
  72. package/campaign-spec/dist/rules/store-profile-shape.js +127 -0
  73. package/campaign-spec/dist/rules/thank-you-requirement.d.ts +16 -0
  74. package/campaign-spec/dist/rules/thank-you-requirement.js +50 -0
  75. package/campaign-spec/dist/rules/unknown-top-level-fields.d.ts +28 -0
  76. package/campaign-spec/dist/rules/unknown-top-level-fields.js +114 -0
  77. package/campaign-spec/dist/rules/upsell-has-packages.d.ts +9 -0
  78. package/campaign-spec/dist/rules/upsell-has-packages.js +35 -0
  79. package/campaign-spec/dist/rules/upsell-routing-complete.d.ts +10 -0
  80. package/campaign-spec/dist/rules/upsell-routing-complete.js +45 -0
  81. package/campaign-spec/dist/rules/upsell-without-checkout.d.ts +11 -0
  82. package/campaign-spec/dist/rules/upsell-without-checkout.js +44 -0
  83. package/campaign-spec/dist/rules/variant-labels-shape.d.ts +28 -0
  84. package/campaign-spec/dist/rules/variant-labels-shape.js +86 -0
  85. package/campaign-spec/dist/sdk-version-parse.d.ts +43 -0
  86. package/campaign-spec/dist/sdk-version-parse.js +62 -0
  87. package/campaign-spec/dist/types.d.ts +674 -0
  88. package/campaign-spec/dist/types.js +40 -0
  89. package/campaign-spec/package.json +12 -0
  90. package/compatibility.json +25 -0
  91. package/contracts/agent-relevant-change-policy.v1.json +111 -0
  92. package/contracts/brand-theme-source-defaults.figma-sections-export.v0.json +32 -0
  93. package/contracts/brand-theme-target-tokens.next-core.v0.json +65 -0
  94. package/contracts/campaign-cart-checkout-field-contract.v0.json +45 -0
  95. package/contracts/campaign-cart-sdk-support-policy.v0.json +11 -0
  96. package/contracts/commerce-surface-catalog.json +2452 -0
  97. package/contracts/fixtures/orientation/canonicalization/v1.json +34 -0
  98. package/contracts/fixtures/orientation/envelope/current.json +95 -0
  99. package/contracts/fixtures/orientation/envelope/freshness_unknown.json +97 -0
  100. package/contracts/fixtures/orientation/envelope/legacy_baseline.json +95 -0
  101. package/contracts/fixtures/orientation/envelope/orientation_available.json +136 -0
  102. package/contracts/fixtures/orientation/envelope/recovered_interrupted_update.json +136 -0
  103. package/contracts/fixtures/orientation/envelope/refused.json +100 -0
  104. package/contracts/fixtures/orientation/envelope/restart_required.json +137 -0
  105. package/contracts/fixtures/orientation/envelope/updated.json +135 -0
  106. package/contracts/fixtures/orientation/hostile-target/README.md +61 -0
  107. package/contracts/fixtures/orientation/hostile-target/manifest.json +82 -0
  108. package/contracts/fixtures/orientation/hostile-target/repo/CHANGELOG.md +18 -0
  109. package/contracts/fixtures/orientation/hostile-target/repo/bin/intended.mjs +12 -0
  110. package/contracts/fixtures/orientation/hostile-target/repo/bin/tripwire.mjs +15 -0
  111. package/contracts/fixtures/orientation/hostile-target/repo/contracts/release-ledger.json +48 -0
  112. package/contracts/fixtures/orientation/hostile-target/repo/contracts/supported-surface.json +17 -0
  113. package/contracts/fixtures/orientation/hostile-target/repo/docs/example-contract.md +13 -0
  114. package/contracts/fixtures/orientation/hostile-target/repo/hooks/post-checkout +5 -0
  115. package/contracts/fixtures/orientation/hostile-target/repo/hooks/post-merge +5 -0
  116. package/contracts/fixtures/orientation/hostile-target/repo/hooks/pre-commit +5 -0
  117. package/contracts/fixtures/orientation/hostile-target/repo/hostile-dependency-tripwire/package.json +15 -0
  118. package/contracts/fixtures/orientation/hostile-target/repo/hostile-dependency-tripwire/tripwire.mjs +9 -0
  119. package/contracts/fixtures/orientation/hostile-target/repo/package.json +20 -0
  120. package/contracts/fixtures/orientation/hostile-target/repo/schemas/example.v0.schema.json +15 -0
  121. package/contracts/fixtures/orientation/release-gate/cases.json +1073 -0
  122. package/contracts/fixtures/runtime-recipe/accept/current.json +299 -0
  123. package/contracts/fixtures/runtime-recipe/accept/minimal.json +294 -0
  124. package/contracts/fixtures/runtime-recipe/dist-states.json +51 -0
  125. package/contracts/fixtures/runtime-recipe/manifest.json +85 -0
  126. package/contracts/fixtures/runtime-recipe/reject/advisory-enforcement.json +299 -0
  127. package/contracts/fixtures/runtime-recipe/reject/allowlist-without-hosts.json +297 -0
  128. package/contracts/fixtures/runtime-recipe/reject/committed-output-claim.json +299 -0
  129. package/contracts/fixtures/runtime-recipe/reject/engines-disagreement-warns.json +299 -0
  130. package/contracts/fixtures/runtime-recipe/reject/lifecycle-scripts-enabled.json +299 -0
  131. package/contracts/fixtures/runtime-recipe/reject/missing-required-field.json +251 -0
  132. package/contracts/fixtures/runtime-recipe/reject/unknown-kind.json +299 -0
  133. package/contracts/fixtures/runtime-recipe/reject/unknown-network-policy.json +299 -0
  134. package/contracts/fixtures/runtime-recipe/reject/unknown-output-check.json +310 -0
  135. package/contracts/fixtures/runtime-recipe/reject/unknown-revision.json +299 -0
  136. package/contracts/fixtures/runtime-recipe/reject/unknown-step-id.json +299 -0
  137. package/contracts/fixtures/runtime-recipe/reject/unperformable-check-skipped.json +299 -0
  138. package/contracts/fixtures/runtime-recipe/reject/unpinned-lockfile.json +299 -0
  139. package/contracts/fixtures/sidecar-bundle/production-shaped/.campaign-runtime/assembly-report.json +180 -0
  140. package/contracts/fixtures/sidecar-bundle/production-shaped/.campaign-runtime/build-context.json +115 -0
  141. package/contracts/fixtures/sidecar-bundle/production-shaped/.campaign-runtime/doctor-output.json +29 -0
  142. package/contracts/fixtures/sidecar-bundle/production-shaped/.campaign-runtime/qa-verdict.json +27 -0
  143. package/contracts/fixtures/sidecar-bundle/production-shaped/campaign-runtime.build.json +141 -0
  144. package/contracts/migration-sidecar-bundle.v0.json +149 -0
  145. package/contracts/orientation-limits.v1.json +41 -0
  146. package/contracts/orientation-reason-codes.v1.json +196 -0
  147. package/contracts/private-template-sources.json +8 -0
  148. package/contracts/release-ledger.json +4598 -0
  149. package/contracts/reserved-skill-names.json +13 -0
  150. package/contracts/runtime-recipe.campaigns-os-node-v1.json +299 -0
  151. package/contracts/supported-surface.json +180 -0
  152. package/contracts/template-brand-contract.apollo-mv-single-step.v0.json +27 -0
  153. package/contracts/template-brand-contract.apollo.v0.json +27 -0
  154. package/contracts/template-brand-contract.demeter.v0.json +27 -0
  155. package/contracts/template-brand-contract.olympus-mv-single-step.v0.json +27 -0
  156. package/contracts/template-brand-contract.olympus-mv-two-step.v0.json +28 -0
  157. package/contracts/template-brand-contract.olympus.v0.json +27 -0
  158. package/contracts/template-brand-contract.shared-commerce.v0.json +190 -0
  159. package/contracts/template-brand-contract.shop-single-step.v0.json +27 -0
  160. package/contracts/template-brand-contract.shop-three-step.v0.json +29 -0
  161. package/contracts/template-slot-manifest.apollo-mv-single-step.v0.json +14 -0
  162. package/contracts/template-slot-manifest.apollo.v0.json +12 -0
  163. package/contracts/template-slot-manifest.demeter.v0.json +30 -0
  164. package/contracts/template-slot-manifest.olympus-mv-single-step.v0.json +14 -0
  165. package/contracts/template-slot-manifest.olympus-mv-two-step.v0.json +15 -0
  166. package/contracts/template-slot-manifest.olympus.v0.json +12 -0
  167. package/contracts/template-slot-manifest.shared-content-core.v0.json +4254 -0
  168. package/contracts/template-slot-manifest.shop-single-step.v0.json +47 -0
  169. package/contracts/template-slot-manifest.shop-three-step.v0.json +33 -0
  170. package/docs/brand-theme-bridge.md +159 -0
  171. package/docs/build-packet.md +1300 -0
  172. package/docs/campaign-build-brief.md +145 -0
  173. package/docs/campaign-standardization-report.md +329 -0
  174. package/docs/campaigns-os-build-flow.md +117 -0
  175. package/docs/design-source-package.md +784 -0
  176. package/docs/legacy-migration.md +58 -0
  177. package/docs/migration-sidecar-bundle.md +139 -0
  178. package/docs/orientation-contract-reference.md +1220 -0
  179. package/docs/polish-evidence.md +502 -0
  180. package/docs/qa-and-test-orders.md +1691 -0
  181. package/docs/release-ledger-authoring-guide.md +274 -0
  182. package/docs/runtime-readiness.md +211 -0
  183. package/docs/supported-surface.md +83 -0
  184. package/docs/versioning.md +55 -0
  185. package/docs/workflow-findings-sidecar.md +588 -0
  186. package/package.json +135 -0
  187. package/prompts/first-build.md +27 -0
  188. package/prompts/friction-log.md +30 -0
  189. package/schemas/campaign-build-brief.v1.schema.json +149 -0
  190. package/schemas/campaign-design-source-package.v0.schema.json +697 -0
  191. package/schemas/campaign-runtime-assembly-report.v0.schema.json +390 -0
  192. package/schemas/campaign-runtime-build-context.v0.schema.json +339 -0
  193. package/schemas/campaign-runtime-build-packet.v0.schema.json +452 -0
  194. package/schemas/campaign-spec.v4.schema.json +582 -0
  195. package/schemas/campaigns-os-doctor-output.v0.schema.json +43 -0
  196. package/schemas/campaigns-os-legacy-migration-inventory.v0.schema.json +112 -0
  197. package/schemas/campaigns-os-legacy-provisioning-plan.v0.schema.json +38 -0
  198. package/schemas/campaigns-os-legacy-provisioning-receipt.v0.schema.json +57 -0
  199. package/schemas/campaigns-os-qa-verdict-sidecar.v0.schema.json +150 -0
  200. package/schemas/campaigns-os-qa-verdict.v0.schema.json +438 -0
  201. package/schemas/campaigns-os-release-ledger.v1.schema.json +162 -0
  202. package/schemas/campaigns-os-run-record.v0.schema.json +343 -0
  203. package/schemas/campaigns-os-runtime-recipe.v1.schema.json +313 -0
  204. package/schemas/campaigns-os-sidecar-bundle-conformance.v0.schema.json +78 -0
  205. package/schemas/campaigns-os-tooling-orientation.v1.schema.json +381 -0
  206. package/schemas/campaigns-os-workflow-finding.v0.schema.json +134 -0
  207. package/schemas/source-html-manifest.v0.schema.json +252 -0
  208. package/skills/next-campaigns-build/SKILL.md +73 -0
  209. package/skills/next-campaigns-os/SKILL.md +101 -0
  210. package/skills/next-campaigns-os/references/session-intake.md +160 -0
  211. package/skills/next-campaigns-os-setup/SKILL.md +22 -0
  212. package/skills/next-campaigns-polish/SKILL.md +145 -0
  213. package/skills/next-campaigns-qa/SKILL.md +92 -0
  214. package/skills.json +56 -0
  215. package/skills.sh +64 -0
  216. package/src/adapter-decision-contract.mjs +333 -0
  217. package/src/brand-theme.mjs +1151 -0
  218. package/src/browser-launch.mjs +79 -0
  219. package/src/build-brief.mjs +781 -0
  220. package/src/built-site-scope.mjs +312 -0
  221. package/src/campaign-ecosystem.mjs +734 -0
  222. package/src/campaign-identity.mjs +405 -0
  223. package/src/campaign-workspace.mjs +127 -0
  224. package/src/checkpoint-waiver.mjs +302 -0
  225. package/src/cli.mjs +13442 -0
  226. package/src/commercial-journey.mjs +1119 -0
  227. package/src/commercial-parity.mjs +965 -0
  228. package/src/consent.mjs +347 -0
  229. package/src/content-residue.mjs +322 -0
  230. package/src/deadline.mjs +81 -0
  231. package/src/design-source-package.mjs +2604 -0
  232. package/src/deviation.mjs +107 -0
  233. package/src/doctor-check-registry.mjs +49 -0
  234. package/src/doctor-sidecar.mjs +106 -0
  235. package/src/finding-cause.mjs +557 -0
  236. package/src/findings.mjs +326 -0
  237. package/src/fs-identity.mjs +68 -0
  238. package/src/gate-actions.mjs +105 -0
  239. package/src/html-scan.mjs +53 -0
  240. package/src/install-mode.mjs +272 -0
  241. package/src/legacy-migration.d.ts +128 -0
  242. package/src/legacy-migration.mjs +510 -0
  243. package/src/lifecycle.mjs +338 -0
  244. package/src/local-proof.mjs +401 -0
  245. package/src/map-pin-writeback.mjs +210 -0
  246. package/src/orchestration-stage-contract.mjs +81 -0
  247. package/src/package-install-fixture.mjs +33 -0
  248. package/src/page-kit-build-summary.mjs +175 -0
  249. package/src/page-kit-campaign-config.mjs +57 -0
  250. package/src/page-kit-sdk-version.mjs +392 -0
  251. package/src/page-kit-store-profile.mjs +369 -0
  252. package/src/page-kit-sync.mjs +162 -0
  253. package/src/polish-browser.mjs +867 -0
  254. package/src/polish-capture.mjs +1094 -0
  255. package/src/polish-deadline.mjs +51 -0
  256. package/src/polish-gate.mjs +739 -0
  257. package/src/polish-node.mjs +639 -0
  258. package/src/polish-page-load.mjs +1100 -0
  259. package/src/private-template-source.mjs +237 -0
  260. package/src/proof-policy.mjs +82 -0
  261. package/src/qa-analytics-correctness.mjs +307 -0
  262. package/src/qa-analytics-errors.mjs +38 -0
  263. package/src/qa-analytics-parity.mjs +699 -0
  264. package/src/qa-binding-evidence.mjs +140 -0
  265. package/src/qa-browser.mjs +6608 -0
  266. package/src/qa-cart-entry.mjs +406 -0
  267. package/src/qa-commercial-parity.mjs +641 -0
  268. package/src/qa-node.mjs +3620 -0
  269. package/src/qa-order-bump.mjs +381 -0
  270. package/src/qa-parity-capture.mjs +428 -0
  271. package/src/qa-parity-fixture.mjs +359 -0
  272. package/src/qa-publish.mjs +362 -0
  273. package/src/qa-purchase-data-layer.mjs +263 -0
  274. package/src/qa-route-probe.mjs +272 -0
  275. package/src/qa-sidecar.mjs +188 -0
  276. package/src/qa-test-order-topology.mjs +207 -0
  277. package/src/qa-url-privacy.mjs +13 -0
  278. package/src/qa-verdict-discovery.mjs +192 -0
  279. package/src/qa-verdict-publish.mjs +105 -0
  280. package/src/qa-verdict.mjs +287 -0
  281. package/src/remit.mjs +388 -0
  282. package/src/repo-scan.mjs +83 -0
  283. package/src/route-identity.mjs +133 -0
  284. package/src/run-record-closeout.mjs +229 -0
  285. package/src/run-record.mjs +839 -0
  286. package/src/run-session.mjs +226 -0
  287. package/src/runtime-state-ignore.mjs +113 -0
  288. package/src/sdk-attribute-index.mjs +212 -0
  289. package/src/sdk-markup.mjs +358 -0
  290. package/src/sdk-meta-tags.mjs +52 -0
  291. package/src/shell-token.mjs +7 -0
  292. package/src/sidecar-bundle.mjs +399 -0
  293. package/src/source-asset-crawl.mjs +469 -0
  294. package/src/source-html-intake.mjs +627 -0
  295. package/src/source-html-manifest.mjs +276 -0
  296. package/src/source-prep.mjs +284 -0
  297. package/src/spec-derive-store.mjs +431 -0
  298. package/src/spec-derive.mjs +514 -0
  299. package/src/spec-fetch.mjs +66 -0
  300. package/src/spec-hash.mjs +48 -0
  301. package/src/spec-identity.mjs +27 -0
  302. package/src/stage-ledger.mjs +509 -0
  303. package/src/standardization-report.mjs +1297 -0
  304. package/src/template-brand-contract.mjs +473 -0
  305. package/src/template-freshness.mjs +196 -0
  306. package/src/template-reference.mjs +81 -0
  307. package/src/template-slot-manifest.mjs +150 -0
  308. package/src/text-safety.mjs +62 -0
  309. package/src/theme-gate.mjs +185 -0
  310. package/src/upsell-selector-scope.mjs +299 -0
@@ -0,0 +1,180 @@
1
+ {
2
+ "schema_version": "campaign-runtime-assembly-report/v0",
3
+ "run_id": "asm_example",
4
+ "generated_at": "2026-08-24T00:00:00.000Z",
5
+ "status": "prepared",
6
+ "identity": {
7
+ "map_id": "runtime-packet-demo-k9x2",
8
+ "public_route_slug": "runtime-packet-demo",
9
+ "campaign_directory": "runtime-packet-demo",
10
+ "live_url_path": "/runtime-packet-demo/",
11
+ "spec_hash": "example-spec-sha256"
12
+ },
13
+ "inputs": {
14
+ "packet_path": "campaign-runtime.build.json",
15
+ "context_path": ".campaign-runtime/build-context.json",
16
+ "spec_path": "campaignspec.v42.basic.json",
17
+ "source": { "kind": "html_funnel", "root": "source-html" },
18
+ "target_repo": "."
19
+ },
20
+ "template_family": {
21
+ "value": "olympus",
22
+ "locked": true,
23
+ "locked_by": "fixture",
24
+ "commerce_catalog_version": "2",
25
+ "candidates": []
26
+ },
27
+ "stages": {
28
+ "prepare_build": {
29
+ "stage": "prepare_build",
30
+ "status": "completed",
31
+ "inputs": [],
32
+ "outputs": ["campaign-runtime.build.json", ".campaign-runtime/build-context.json", ".campaign-runtime/assembly-report.json"],
33
+ "commands": [],
34
+ "blockers": [],
35
+ "warnings": []
36
+ },
37
+ "doctor": { "stage": "doctor", "status": "pending", "inputs": [], "outputs": [], "commands": [], "blockers": [], "warnings": [] },
38
+ "setup": { "stage": "setup", "status": "pending", "inputs": [], "outputs": [], "commands": [], "blockers": [], "warnings": [] },
39
+ "assembly": { "stage": "assembly", "status": "pending", "inputs": [], "outputs": [], "commands": [], "blockers": [], "warnings": [] },
40
+ "polish": { "stage": "polish", "status": "pending", "inputs": [], "outputs": [], "commands": [], "blockers": [], "warnings": [] },
41
+ "deploy": { "stage": "deploy", "status": "pending", "inputs": [], "outputs": [], "commands": [], "blockers": [], "warnings": [] },
42
+ "qa": { "stage": "qa", "status": "pending", "inputs": [], "outputs": [], "commands": [], "blockers": [], "warnings": [] }
43
+ },
44
+ "decisions": [
45
+ {
46
+ "id": "dec_page_map_checkout",
47
+ "stage": "prepare_build",
48
+ "decision_type": "deterministic_derivation",
49
+ "decision": "mapped CampaignSpec page \"checkout\" to source file \"checkout.html\"",
50
+ "evidence_ids": [],
51
+ "confidence": "high",
52
+ "blast_radius": "routing",
53
+ "requires_ack": false,
54
+ "acknowledged_by": null
55
+ }
56
+ ],
57
+ "adapter_decisions": {
58
+ "raw_html_conversion_status": "completed",
59
+ "source_asset_strategy": "pagekit_campaign_asset_root",
60
+ "route_rewrite_policy": "campaignspec_routes_via_campaign_link",
61
+ "config_script_strategy": "campaign_asset",
62
+ "commerce_shell_adoption": "template_clone_first_verified",
63
+ "wrapper_policy": "strip_document_wrappers",
64
+ "frontmatter_policy": "pagekit_yaml_frontmatter",
65
+ "script_style_reference_policy": "frontmatter_or_campaign_asset",
66
+ "cta_rewrite_policy": "campaignspec_routes_via_campaign_link",
67
+ "layout_choice": "campaign_layout",
68
+ "template_files_copied": {
69
+ "status": "verified_existing_slice",
70
+ "required_groups": ["pages", "_includes", "_layouts", "assets/css", "assets/js", "frontmatter_vocabulary"],
71
+ "groups": ["pages", "_includes", "_layouts", "assets/css", "assets/js", "frontmatter_vocabulary"],
72
+ "paths": ["src/runtime-packet-demo", "src/runtime-packet-demo/_includes", "src/runtime-packet-demo/_layouts", "src/runtime-packet-demo/assets/css", "src/runtime-packet-demo/assets/js"]
73
+ }
74
+ },
75
+ "proof_policy": {
76
+ "browser_qa_required": true,
77
+ "typed_card_depth": "common",
78
+ "localhost_development_domain_allowed": true,
79
+ "non_localhost_origin_allowlist_required": true,
80
+ "order_path_depth": "common",
81
+ "operator_approval_state": "not_required_global_test_cards",
82
+ "qa_portal_publish_default": true
83
+ },
84
+ "evidence": [],
85
+ "blockers": [],
86
+ "warnings": [
87
+ {
88
+ "code": "SOURCE_COMMERCE_REVIEW",
89
+ "stage": "assembly",
90
+ "message": "Source HTML contains possible commerce zones. Build must preserve catalog-owned runtime surfaces."
91
+ }
92
+ ],
93
+ "checklists": {
94
+ "polish": {
95
+ "anchor_screenshots": [
96
+ {
97
+ "page_type": "checkout",
98
+ "anchor": "bundle_selector",
99
+ "viewports": ["desktop", "mobile"],
100
+ "evidence": ["screenshots/checkout-bundle-desktop.png", "screenshots/checkout-bundle-mobile.png"]
101
+ },
102
+ {
103
+ "page_type": "checkout",
104
+ "anchor": "customer_info",
105
+ "viewports": ["desktop", "mobile"],
106
+ "evidence": ["screenshots/checkout-customer-desktop.png", "screenshots/checkout-customer-mobile.png"]
107
+ },
108
+ {
109
+ "page_type": "checkout",
110
+ "anchor": "shipping_address",
111
+ "viewports": ["desktop", "mobile"],
112
+ "evidence": ["screenshots/checkout-shipping-desktop.png", "screenshots/checkout-shipping-mobile.png"]
113
+ },
114
+ {
115
+ "page_type": "checkout",
116
+ "anchor": "payment_method",
117
+ "viewports": ["desktop", "mobile"],
118
+ "evidence": ["screenshots/checkout-payment-desktop.png", "screenshots/checkout-payment-mobile.png"]
119
+ },
120
+ {
121
+ "page_type": "checkout",
122
+ "anchor": "submit_order_summary",
123
+ "viewports": ["desktop", "mobile"],
124
+ "evidence": ["screenshots/checkout-submit-desktop.png", "screenshots/checkout-submit-mobile.png"]
125
+ }
126
+ ],
127
+ "state_screenshots": [
128
+ {
129
+ "page_type": "checkout",
130
+ "state": "selected_bundle_tier",
131
+ "viewports": ["desktop", "mobile"],
132
+ "evidence": ["screenshots/checkout-selected-bundle-desktop.png", "screenshots/checkout-selected-bundle-mobile.png"]
133
+ }
134
+ ],
135
+ "runtime_smoke": [
136
+ {
137
+ "page_type": "checkout",
138
+ "state": "console_clean",
139
+ "viewports": ["desktop", "mobile"],
140
+ "evidence": ["logs/checkout-console.txt"]
141
+ }
142
+ ]
143
+ },
144
+ "template_family": {
145
+ "family": "olympus",
146
+ "invariants": [
147
+ {
148
+ "id": "olympus.mobile_bundle_horizontal_order",
149
+ "status": "passed",
150
+ "evidence": ["screenshots/checkout-selected-bundle-mobile.png"]
151
+ },
152
+ {
153
+ "id": "olympus.checkout_fields_full_width",
154
+ "status": "passed",
155
+ "evidence": ["screenshots/checkout-shipping-mobile.png"]
156
+ },
157
+ {
158
+ "id": "olympus.spreedly_no_duplicate_fallback_text",
159
+ "status": "passed",
160
+ "evidence": ["screenshots/checkout-payment-mobile.png"]
161
+ },
162
+ {
163
+ "id": "olympus.payment_metadata_no_overlap",
164
+ "status": "passed",
165
+ "evidence": ["screenshots/checkout-payment-desktop.png", "screenshots/checkout-payment-mobile.png"]
166
+ },
167
+ {
168
+ "id": "olympus.selected_state_shape_stable",
169
+ "status": "passed",
170
+ "evidence": ["screenshots/checkout-selected-bundle-desktop.png", "screenshots/checkout-selected-bundle-mobile.png"]
171
+ }
172
+ ]
173
+ }
174
+ },
175
+ "next": {
176
+ "stage": "setup",
177
+ "owner": "next-campaigns-os-setup",
178
+ "action": "Run Page Kit scaffold using the doctor-cleared packet, then hand setup output to build."
179
+ }
180
+ }
@@ -0,0 +1,115 @@
1
+ {
2
+ "schema_version": "campaign-runtime-build-context/v0",
3
+ "generated_at": "2026-08-24T00:00:00.000Z",
4
+ "source_adapter": "html_funnel",
5
+ "status": "prepared",
6
+ "packet_path": "campaign-runtime.build.json",
7
+ "report_path": ".campaign-runtime/assembly-report.json",
8
+ "spec": {
9
+ "path": "campaignspec.v42.basic.json",
10
+ "hash": "example-spec-sha256",
11
+ "active_pages": [
12
+ { "id": "landing", "type": "landing", "label": "Landing", "page_url": "landing/" },
13
+ { "id": "checkout", "type": "checkout", "label": "Checkout", "page_url": "checkout/" }
14
+ ]
15
+ },
16
+ "source": {
17
+ "root": "source-html",
18
+ "html_files": [
19
+ { "path": "landing.html", "name": "landing.html", "basename": "landing", "bytes": 1000, "sha256": "example-html-sha256" },
20
+ { "path": "checkout.html", "name": "checkout.html", "basename": "checkout", "bytes": 2000, "sha256": "example-html-sha256" }
21
+ ]
22
+ },
23
+ "page_map": [
24
+ {
25
+ "page_id": "landing",
26
+ "source_path": "landing.html",
27
+ "skip_reason": null,
28
+ "output_path": "src/runtime-packet-demo/landing.html",
29
+ "page_kit": {
30
+ "target_path": "landing.html",
31
+ "output_path": "src/runtime-packet-demo/landing.html",
32
+ "public_route": "/runtime-packet-demo/landing/",
33
+ "spec_route": "landing/",
34
+ "page_type": "product",
35
+ "permalink_required": false,
36
+ "frontmatter": {
37
+ "page_type": "product",
38
+ "next_url": "/runtime-packet-demo/checkout/"
39
+ }
40
+ }
41
+ },
42
+ {
43
+ "page_id": "checkout",
44
+ "source_path": "checkout.html",
45
+ "skip_reason": null,
46
+ "output_path": "src/runtime-packet-demo/checkout.html",
47
+ "page_kit": {
48
+ "target_path": "checkout.html",
49
+ "output_path": "src/runtime-packet-demo/checkout.html",
50
+ "public_route": "/runtime-packet-demo/checkout/",
51
+ "spec_route": "checkout/",
52
+ "page_type": "checkout",
53
+ "permalink_required": false,
54
+ "frontmatter": {
55
+ "page_type": "checkout"
56
+ }
57
+ }
58
+ }
59
+ ],
60
+ "scaffold": {
61
+ "mode": "fresh",
62
+ "required": true,
63
+ "target_repo": ".",
64
+ "output_dir": "src/runtime-packet-demo",
65
+ "handoff_skill": "next-campaigns-os-setup",
66
+ "handoff_artifact": ".campaign-runtime/setup-handoff.json",
67
+ "reason": "Target campaign output directory is missing; run Page Kit scaffold before build."
68
+ },
69
+ "template": {
70
+ "family": "olympus",
71
+ "locked": true,
72
+ "lock": { "locked": true, "locked_by": "fixture", "confidence": "high", "evidence": ["contracts/fixtures/campaign-specs/olympus-tiered-standard-free.json"] },
73
+ "candidates": []
74
+ },
75
+ "adapter_decisions": {
76
+ "raw_html_conversion_status": "pending",
77
+ "source_asset_strategy": "pagekit_campaign_asset_root",
78
+ "route_rewrite_policy": "campaignspec_routes_via_campaign_link",
79
+ "config_script_strategy": "campaign_asset",
80
+ "commerce_shell_adoption": "template_clone_first_required",
81
+ "wrapper_policy": "strip_document_wrappers",
82
+ "frontmatter_policy": "pagekit_yaml_frontmatter",
83
+ "script_style_reference_policy": "frontmatter_or_campaign_asset",
84
+ "cta_rewrite_policy": "campaignspec_routes_via_campaign_link",
85
+ "layout_choice": "campaign_layout",
86
+ "template_files_copied": {
87
+ "status": "pending",
88
+ "required_groups": ["pages", "_includes", "_layouts", "assets/css", "assets/js", "frontmatter_vocabulary"],
89
+ "groups": [],
90
+ "paths": []
91
+ }
92
+ },
93
+ "commerce_zone_findings": [
94
+ {
95
+ "path": "checkout.html",
96
+ "zones": ["checkout", "payment"],
97
+ "sdk_attributes": [],
98
+ "action": "review_and_preserve_catalog_surfaces",
99
+ "note": "HTML source may express visual intent here, but catalog-owned runtime shapes must remain authoritative."
100
+ }
101
+ ],
102
+ "prompts_required": [],
103
+ "decisions": [
104
+ {
105
+ "id": "dec_page_map_checkout",
106
+ "stage": "prepare_build",
107
+ "decision_type": "deterministic_derivation",
108
+ "decision": "mapped CampaignSpec page \"checkout\" to source file \"checkout.html\"",
109
+ "confidence": "high",
110
+ "blast_radius": "routing",
111
+ "requires_ack": false,
112
+ "evidence": ["matched source filename against page keys: checkout"]
113
+ }
114
+ ]
115
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "schema_version": "campaigns-os-doctor-output/v0",
3
+ "generated_at": "2026-08-24T00:01:00.000Z",
4
+ "generated_by": "doctor",
5
+ "ok": true,
6
+ "status": "ready_with_warnings",
7
+ "errors": [],
8
+ "warnings": [
9
+ {
10
+ "code": "deploy.preview_url",
11
+ "message": "Preview URL is not recorded yet."
12
+ }
13
+ ],
14
+ "ready": [
15
+ "Build Packet schema campaign-runtime-build-packet/v0",
16
+ "Build context schema campaign-runtime-build-context/v0"
17
+ ],
18
+ "derived": {
19
+ "packet_path": "campaign-runtime.build.json",
20
+ "map_id": "runtime-packet-demo-k9x2",
21
+ "public_route_slug": "runtime-packet-demo",
22
+ "template_family": "olympus"
23
+ },
24
+ "next": {
25
+ "stage": "deploy",
26
+ "owner": "campaign-operator",
27
+ "action": "Record the preview deployment before QA."
28
+ }
29
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "schema_version": "1.0",
3
+ "run_id": "MSRBUNDLEFIXTURE000000000000",
4
+ "campaign_slug": "runtime-packet-demo-k9x2",
5
+ "public_route_slug": "runtime-packet-demo",
6
+ "spec_version": "4.2",
7
+ "spec_hash": "example-spec-sha256",
8
+ "started_at": "2026-08-24T00:02:00.000Z",
9
+ "completed_at": "2026-08-24T00:03:00.000Z",
10
+ "generated_at": "2026-08-24T00:04:00.000Z",
11
+ "runtime": "campaigns-os-node-qa@0.1.0-alpha.0",
12
+ "disposition": "ready",
13
+ "entry_urls": [],
14
+ "page_urls": [],
15
+ "tested_urls": [],
16
+ "assertions": [
17
+ {
18
+ "id": "http:checkout",
19
+ "family": "funnel-flow",
20
+ "page": "checkout",
21
+ "status": "pass",
22
+ "severity": "info"
23
+ }
24
+ ],
25
+ "test_orders": [],
26
+ "exceptions": []
27
+ }
@@ -0,0 +1,141 @@
1
+ {
2
+ "schema_version": "campaign-runtime-build-packet/v0",
3
+ "generated_at": "2026-08-24T00:00:00.000Z",
4
+ "campaign": {
5
+ "public_route_slug": "runtime-packet-demo",
6
+ "campaign_directory": "runtime-packet-demo",
7
+ "live_url_path": "/runtime-packet-demo/",
8
+ "campaigns_app_url": null,
9
+ "api_key_source": "env:CAMPAIGNS_API_KEY",
10
+ "allowed_domains_confirmed": true
11
+ },
12
+ "spec": {
13
+ "map_id": "runtime-packet-demo-k9x2",
14
+ "spec_url": "https://campaign-map.nextcommerce.com/api/spec/runtime-packet-demo-k9x2",
15
+ "local_path": "campaignspec.v42.basic.json"
16
+ },
17
+ "source_html": {
18
+ "root": "source-html",
19
+ "pages": [
20
+ {
21
+ "page_id": "landing",
22
+ "path": "landing.html",
23
+ "page_kit": {
24
+ "target_path": "landing.html",
25
+ "output_path": "src/runtime-packet-demo/landing.html",
26
+ "public_route": "/runtime-packet-demo/landing/",
27
+ "spec_route": "landing/",
28
+ "page_type": "product",
29
+ "permalink_required": false,
30
+ "frontmatter": {
31
+ "page_type": "product",
32
+ "next_url": "/runtime-packet-demo/checkout/"
33
+ }
34
+ }
35
+ },
36
+ {
37
+ "page_id": "checkout",
38
+ "path": "checkout.html",
39
+ "page_kit": {
40
+ "target_path": "checkout.html",
41
+ "output_path": "src/runtime-packet-demo/checkout.html",
42
+ "public_route": "/runtime-packet-demo/checkout/",
43
+ "spec_route": "checkout/",
44
+ "page_type": "checkout",
45
+ "permalink_required": false,
46
+ "frontmatter": {
47
+ "page_type": "checkout",
48
+ "next_url": "/runtime-packet-demo/upsell/"
49
+ }
50
+ }
51
+ },
52
+ {
53
+ "page_id": "upsell",
54
+ "path": "upsell.html",
55
+ "page_kit": {
56
+ "target_path": "upsell.html",
57
+ "output_path": "src/runtime-packet-demo/upsell.html",
58
+ "public_route": "/runtime-packet-demo/upsell/",
59
+ "spec_route": "upsell/",
60
+ "page_type": "upsell",
61
+ "permalink_required": false,
62
+ "frontmatter": {
63
+ "page_type": "upsell",
64
+ "next_url": "/runtime-packet-demo/receipt/"
65
+ }
66
+ }
67
+ },
68
+ {
69
+ "page_id": "receipt",
70
+ "path": "receipt.html",
71
+ "page_kit": {
72
+ "target_path": "receipt.html",
73
+ "output_path": "src/runtime-packet-demo/receipt.html",
74
+ "public_route": "/runtime-packet-demo/receipt/",
75
+ "spec_route": "receipt/",
76
+ "page_type": "receipt",
77
+ "permalink_required": false,
78
+ "frontmatter": {
79
+ "page_type": "receipt"
80
+ }
81
+ }
82
+ }
83
+ ],
84
+ "adapter_contract": {
85
+ "raw_html_conversion_status": "pending",
86
+ "source_asset_strategy": "pagekit_campaign_asset_root",
87
+ "route_rewrite_policy": "campaignspec_routes_via_campaign_link",
88
+ "config_script_strategy": "campaign_asset",
89
+ "commerce_shell_adoption": "template_clone_first_required",
90
+ "wrapper_policy": "strip_document_wrappers",
91
+ "frontmatter_policy": "pagekit_yaml_frontmatter",
92
+ "script_style_reference_policy": "frontmatter_or_campaign_asset",
93
+ "cta_rewrite_policy": "campaignspec_routes_via_campaign_link",
94
+ "layout_choice": "campaign_layout",
95
+ "template_files_copied": {
96
+ "status": "pending",
97
+ "required_groups": ["pages", "_includes", "_layouts", "assets/css", "assets/js", "frontmatter_vocabulary"],
98
+ "groups": [],
99
+ "paths": []
100
+ }
101
+ }
102
+ },
103
+ "assembly": {
104
+ "implementation": "next-campaigns-build",
105
+ "target_repo": ".",
106
+ "output_dir": "src/runtime-packet-demo",
107
+ "template_family": "olympus",
108
+ "template_decision_notes": "Golden-path fixture locks Olympus for the default prepared-HTML flow; builders may choose Demeter or shop-single-step when those families better match the campaign.",
109
+ "template_lock": {
110
+ "locked": true,
111
+ "locked_by": "fixture",
112
+ "confidence": "high",
113
+ "evidence": ["contracts/fixtures/campaign-specs/olympus-tiered-standard-free.json"]
114
+ },
115
+ "commerce_catalog": {
116
+ "required": true,
117
+ "family": "olympus",
118
+ "version": "2",
119
+ "path": "../contracts/commerce-surface-catalog.json"
120
+ },
121
+ "compatible_outputs": ["static-html", "campaign-cart-sdk"]
122
+ },
123
+ "deploy": {
124
+ "target": "netlify",
125
+ "preview_url": null,
126
+ "production_url": null
127
+ },
128
+ "qa": {
129
+ "proof_policy": {
130
+ "browser_qa_required": true,
131
+ "typed_card_depth": "common",
132
+ "localhost_development_domain_allowed": true,
133
+ "non_localhost_origin_allowlist_required": true,
134
+ "order_path_depth": "common",
135
+ "operator_approval_state": "not_required_global_test_cards",
136
+ "qa_portal_publish_default": true
137
+ },
138
+ "test_order_policy_notes": "Test Orders use global test cards that bypass the gateway and create no transactions. Run them with `qa run --test-order common` by default; use `full` only for exhaustive proof. Localhost on any port is a Development domain for SDK QA; non-localhost preview/production origins still need SDK origin allowlist confirmation. These flags are informational, not a permission gate."
139
+ },
140
+ "notes": "Synthetic v0 example. Values must be replaced with actual CampaignSpec/API values for a real campaign."
141
+ }
@@ -0,0 +1,149 @@
1
+ {
2
+ "schema_version": "campaigns-os-migration-sidecar-bundle-contract/v0",
3
+ "bundle_id": "campaigns-os-migration-sidecar-bundle/v0",
4
+ "packet_discovery": {
5
+ "canonical_path": "campaign-runtime.build.json",
6
+ "legacy_path": ".campaign-runtime/campaign-runtime.build.json",
7
+ "selection_authority": "campaign-runtime.build.json#generated_at",
8
+ "forbidden_selection_authority": "filesystem_mtime",
9
+ "legacy_remedy": "Regenerate or move the Build Packet to repository-root campaign-runtime.build.json, then refresh the canonical sidecars.",
10
+ "noncanonical_remedy": "Run bundle check against the repository-root campaign-runtime.build.json. If this packet is authoritative, move or regenerate it there, then refresh the canonical sidecars."
11
+ },
12
+ "artifacts": [
13
+ {
14
+ "kind": "build_packet",
15
+ "path": "campaign-runtime.build.json",
16
+ "requirement": "required",
17
+ "schema_version": "campaign-runtime-build-packet/v0",
18
+ "schema_path": "schemas/campaign-runtime-build-packet.v0.schema.json",
19
+ "freshness_field": "generated_at",
20
+ "volatile_fields": ["generated_at"]
21
+ },
22
+ {
23
+ "kind": "build_context",
24
+ "path": ".campaign-runtime/build-context.json",
25
+ "requirement": "required",
26
+ "schema_version": "campaign-runtime-build-context/v0",
27
+ "schema_path": "schemas/campaign-runtime-build-context.v0.schema.json",
28
+ "freshness_field": "generated_at",
29
+ "volatile_fields": ["generated_at"]
30
+ },
31
+ {
32
+ "kind": "assembly_report",
33
+ "path": ".campaign-runtime/assembly-report.json",
34
+ "requirement": "required",
35
+ "schema_version": "campaign-runtime-assembly-report/v0",
36
+ "schema_path": "schemas/campaign-runtime-assembly-report.v0.schema.json",
37
+ "freshness_field": "generated_at",
38
+ "volatile_fields": ["generated_at", "run_id"]
39
+ },
40
+ {
41
+ "kind": "doctor_output",
42
+ "path": ".campaign-runtime/doctor-output.json",
43
+ "requirement": "required",
44
+ "schema_version": "campaigns-os-doctor-output/v0",
45
+ "schema_path": "schemas/campaigns-os-doctor-output.v0.schema.json",
46
+ "freshness_field": "generated_at",
47
+ "volatile_fields": ["generated_at", "stale_marked_at"]
48
+ },
49
+ {
50
+ "kind": "qa_verdict",
51
+ "path": ".campaign-runtime/qa-verdict.json",
52
+ "requirement": "required_after_qa",
53
+ "schema_version": "1.0",
54
+ "schema_path": "schemas/campaigns-os-qa-verdict-sidecar.v0.schema.json",
55
+ "freshness_field": "generated_at",
56
+ "volatile_fields": ["generated_at", "started_at", "completed_at", "run_id"]
57
+ }
58
+ ],
59
+ "identity_fields": [
60
+ {
61
+ "name": "map_id",
62
+ "artifact_paths": {
63
+ "build_packet": "spec.map_id",
64
+ "assembly_report": "identity.map_id",
65
+ "doctor_output": "derived.map_id",
66
+ "qa_verdict": "campaign_slug"
67
+ }
68
+ },
69
+ {
70
+ "name": "public_route_slug",
71
+ "artifact_paths": {
72
+ "build_packet": "campaign.public_route_slug",
73
+ "assembly_report": "identity.public_route_slug",
74
+ "doctor_output": "derived.public_route_slug",
75
+ "qa_verdict": "public_route_slug"
76
+ }
77
+ },
78
+ {
79
+ "name": "campaign_directory",
80
+ "artifact_paths": {
81
+ "build_packet": "campaign.campaign_directory",
82
+ "assembly_report": "identity.campaign_directory"
83
+ }
84
+ },
85
+ {
86
+ "name": "live_url_path",
87
+ "artifact_paths": {
88
+ "build_packet": "campaign.live_url_path",
89
+ "assembly_report": "identity.live_url_path"
90
+ }
91
+ },
92
+ {
93
+ "name": "template_family",
94
+ "artifact_paths": {
95
+ "build_packet": "assembly.template_family",
96
+ "build_context": "template.family",
97
+ "assembly_report": "template_family.value",
98
+ "doctor_output": "derived.template_family"
99
+ }
100
+ },
101
+ {
102
+ "name": "spec_hash",
103
+ "artifact_paths": {
104
+ "build_context": "spec.hash",
105
+ "assembly_report": "identity.spec_hash"
106
+ },
107
+ "meaning": "Exact raw-byte integrity for the authored CampaignSpec. This identity is never compared with QA's semantic spec hash."
108
+ },
109
+ {
110
+ "name": "spec_material_hash",
111
+ "artifact_paths": {
112
+ "build_context": "spec.material_hash",
113
+ "assembly_report": "identity.spec_material_hash",
114
+ "qa_verdict": "spec_hash"
115
+ },
116
+ "meaning": "Canonical CampaignSpec material identity used for cross-producer QA correlation.",
117
+ "compatibility": {
118
+ "mode": "complete_material_or_strict_legacy_exact",
119
+ "legacy_artifact_paths": {
120
+ "build_context": "spec.hash",
121
+ "assembly_report": "identity.spec_hash"
122
+ },
123
+ "rule": "When neither producer has a material identity, compare the legacy producer raw-byte values exactly and do not compare them with QA's semantic spec hash. When either producer has a material identity, every present bundle artifact must carry the material identity. Mixed producer generations fail closed."
124
+ }
125
+ }
126
+ ],
127
+ "repository_relative_paths": {
128
+ "equivalent_spellings": ["campaign-runtime.build.json", "./campaign-runtime.build.json"],
129
+ "forbidden": ["absolute", "uri", "backslash", "parent_traversal"],
130
+ "rule": "Normalize only empty and current-directory segments before comparing canonical repository-relative artifact names."
131
+ },
132
+ "ci_producer": {
133
+ "refresh_doctor": "campaigns-os doctor --packet campaign-runtime.build.json --strip-paths --json",
134
+ "promote_historical_qa": "campaigns-os qa promote --packet campaign-runtime.build.json --verdict <explicit-full-verdict.json> --json",
135
+ "check_base_bundle": "campaigns-os bundle check --packet campaign-runtime.build.json --json",
136
+ "check_qa_complete_bundle": "campaigns-os bundle check --packet campaign-runtime.build.json --require-qa --json",
137
+ "preserve_authored": [
138
+ "campaign-runtime.build.json",
139
+ ".campaign-runtime/build-context.json",
140
+ ".campaign-runtime/assembly-report.json"
141
+ ],
142
+ "never_select_qa_by": ["filesystem_mtime", "filename_sort", "directory_latest"]
143
+ },
144
+ "compatibility": {
145
+ "markdown_may_coexist": true,
146
+ "markdown_is_readback_truth": false,
147
+ "migration_specific_scripts_are_contract": false
148
+ }
149
+ }