@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
package/CONTEXT.md ADDED
@@ -0,0 +1,685 @@
1
+ # Campaigns OS Context
2
+
3
+ Campaigns OS coordinates campaign build, proof, and learning work around a
4
+ CampaignSpec-driven workflow. This glossary keeps the public workflow language
5
+ separate from internal orchestration, QA defects, and implementation artifacts.
6
+
7
+ ## Language
8
+
9
+ **Certified Template Family**:
10
+ A template family present in the commerce surface catalog AND carrying a
11
+ template brand contract — the set the OS can automate end-to-end with
12
+ deterministic assembly, residue QA, and pricing contracts. `start`/
13
+ `prepare-build` accept only certified families by default; building on
14
+ anything else requires `--allow-uncertified-template "<reason>"`, recorded on
15
+ the Build Packet as `assembly.template_certification.waiver`. NEXT provides
16
+ the rails: the certified set grows by shipping new contracted families, not
17
+ by loosening the gate.
18
+ _Avoid_: supported template, known family, template allowlist
19
+
20
+ **Theme Gate**:
21
+ The deterministic decision point that blocks `next polish|deploy|qa` and
22
+ `qa run` when theme inspect proved a brand theme is generatable, the campaign
23
+ ships commerce pages, and the brand layer is neither applied (after
24
+ `next-core.css`) nor explicitly waived. Evaluated once in the doctor
25
+ (`derived.theme_gate`) and consumed identically by `next` and QA. A waiver
26
+ (`theme waive` / `--theme-waive`) is the only sanctioned bypass and is recorded
27
+ on the Assembly Report with a reason.
28
+ _Avoid_: advisory warning, recommendation, soft check
29
+
30
+ **Template Brand Contract**:
31
+ A per-family contract file (`contracts/template-brand-contract.<family>.v0.json`)
32
+ declaring required `--brand--*` token overrides, starter defaults that count as
33
+ shipped residue (palette hexes, starter logo, unsupported payment chrome), the
34
+ CSS load-order rule for the brand layer, the selectors browser QA inspects for
35
+ applied brand tokens, and pricing-surface modes. QA reads it to fail "still
36
+ visually the starter template" deterministically.
37
+ _Avoid_: style guide, design tokens doc, theme report
38
+
39
+ **Template Reference**:
40
+ The canonical baseline for a template family: its safe runtime structure,
41
+ expected screenshots or render references, default assets, starter residue
42
+ signatures, and family-specific comparison anchors. Template Reference is
43
+ declared by the Template Brand Contract and may be supported by captured
44
+ reference artifacts; the normal authority is template-versioned, while campaign
45
+ runs may capture or refresh references for provenance when needed. Template
46
+ Reference informs Build and Polish about the selected template family without
47
+ becoming campaign creative intent.
48
+ _Avoid_: design source, starter inspiration, visual target
49
+
50
+ **Pricing Mode**:
51
+ The declarative way a pricing surface (checkout bundle, bump, upsell) renders
52
+ its price rows: `full_price`, `discounted`, `compare_at`, `unit_total`, or
53
+ `unit_only`. Partials render the right rows for the mode; campaign CSS must
54
+ never hide price rows with `display:none`. A full-price upsell shows exactly
55
+ one visible price row; zero visible price rows is a QA blocker.
56
+ _Avoid_: CSS cleanup, price hiding, discount styling
57
+
58
+ **Deviation Telemetry**:
59
+ The sidecar journal (`.campaign-runtime/agent-deviations.jsonl`) that records
60
+ when a pipeline-advancing command does not match the last `campaigns-os next`
61
+ recommendation on an active run session: recommended stage/commands, actual
62
+ command, and an optional `--deviation-reason`. It measures "the agent ignored
63
+ the orchestrator"; hard enforcement lives in the gates, not here.
64
+ _Avoid_: audit log, compliance gate, blocker
65
+
66
+ **Run Telemetry**:
67
+ The Campaigns OS surface that captures what happened on each run and, with
68
+ consent, remits it to NEXT so the toolchain improves over time. Capture is
69
+ always local; consent gates remit only. Run Telemetry is the umbrella that
70
+ Workflow Findings now sit inside as one channel — it is not a separate product
71
+ from the findings work, it is its grown-up form.
72
+ _Avoid_: analytics SDK, crash reporter, separate feedback product
73
+
74
+ **Run Record**:
75
+ The per-run manifest Run Telemetry produces, keyed by one canonical `run_id` and
76
+ written to `.campaign-runtime/run-records/<run_id>.json`. It carries a stable
77
+ envelope, run identity, source-artifact references (`{path, schema_version,
78
+ sha256, material_fingerprint}` where available), normalized observation arrays
79
+ (doctor codes, spec-rule fires, adapter decisions, QA disposition), and a
80
+ snapshot of this run's Workflow Findings. It may snapshot the Campaign Readiness
81
+ Readback for audit, but it references the proof trail; it does not re-embed or
82
+ replace it.
83
+ _Avoid_: unified mega-artifact, log dump, proof artifact
84
+
85
+ **Workflow Finding**:
86
+ A human- or agent-observed gap, friction, or positive signal about the Campaigns
87
+ OS workflow itself. A Workflow Finding may cite a Build Packet, Assembly Report,
88
+ doctor output, or QA Verdict as evidence, but it does not replace those artifacts.
89
+ _Avoid_: QA defect, bug report, friction log
90
+
91
+ **Findings Sidecar**:
92
+ The local Workflow Finding capture channel — the human/agent lane within Run
93
+ Telemetry, distinct from the automatic system-signal lane. It records local
94
+ findings (append-only journal) and is not the owner of remit, Linear routing,
95
+ team assignment, or internal prioritization. "Sidecar" now names this channel,
96
+ not the whole telemetry surface (that is Run Telemetry / the Run Record).
97
+ _Avoid_: the telemetry surface, Linear sync, feedback dashboard, QA reporter
98
+
99
+ **Observation Stage**:
100
+ The lifecycle moment where a Workflow Finding was noticed. Observation Stage is
101
+ broader than the orchestration stage picker: it includes `overall`, `intake`,
102
+ `start`, `doctor`, `setup`, `build`, `polish`, `deploy`, `qa`, `test-order`, and
103
+ `next`.
104
+ _Avoid_: status, owner, milestone
105
+
106
+ **Findings Journal**:
107
+ The append-only local record of Workflow Findings for a campaign run. The
108
+ Findings Journal preserves observed workflow signals; summaries, deduplication,
109
+ and routing are derived later by internal aggregation.
110
+ _Avoid_: current summary, backlog, dashboard state
111
+
112
+ **Finding Capture**:
113
+ The act of adding a Workflow Finding to the local Learning Trail. Finding
114
+ Capture should be available to both Campaigns OS Operators and agents without
115
+ requiring internal NEXT systems.
116
+ _Avoid_: submission, sync, issue creation
117
+
118
+ **Learning Trail**:
119
+ The accumulating record of workflow signals that helps Campaigns OS improve over
120
+ time, now realized as Run Telemetry's Run Records (system signal + the findings
121
+ channel). The Learning Trail is separate from the formal proof trail recorded in
122
+ the Assembly Report, doctor output, and QA Verdict.
123
+ _Avoid_: launch evidence, stage proof, assembly status
124
+
125
+ **Campaign Run Identity**:
126
+ The context that ties a Run Record and its Workflow Findings to one campaign run.
127
+ A canonical `run_id` is the correlation and idempotency key, minted at the run
128
+ boundary and threaded through the run (and onto findings) so a run's signal is
129
+ exact, not time-inferred. Best-effort descriptive identity — Map ID, campaign
130
+ slug, target repo, packet path, Assembly Report path, QA run ID, source type,
131
+ template family — travels alongside it and may be incomplete; missing identity
132
+ never prevents capture.
133
+ _Avoid_: required metadata, primary key, campaign record
134
+
135
+ **Run Session**:
136
+ An ambient `run_id` resolved once for a run so that the commands a run touches
137
+ (doctor, harvest, findings add, run-record) share one identity without each call
138
+ re-specifying it. An explicit `--run-id` always wins over the session.
139
+ _Avoid_: global mutable state, per-command id reinvention
140
+
141
+ **Readiness Checkpoint**:
142
+ A durable lifecycle boundary that lets Campaigns OS say whether a campaign can
143
+ proceed, is blocked, or is ready with explicit gaps or waivers. `ready_with_gaps`
144
+ is a valid checkpoint outcome when known Source Gaps are present but the work is
145
+ ready enough for the next stage; unfinished TODOs remain blocking unless
146
+ explicitly waived. A Readiness Checkpoint is artifact-backed and resumable across
147
+ turns, sessions, or machines; a one-shot campaign run is only the best-case path
148
+ where every checkpoint is already satisfied. Checkpoints expose what was
149
+ handled, what was not handled, and what must be resolved next without relying on
150
+ chat history.
151
+ _Avoid_: launch readiness, session transcript, vague status
152
+
153
+ **Checkpoint Status**:
154
+ The shared small vocabulary used to summarize Readiness Checkpoints across
155
+ Campaigns OS stages: `pending`, `blocked`, `ready`, `ready_with_gaps`,
156
+ `ready_with_waivers`, `completed`, `completed_with_warnings`, and `skipped`.
157
+ `ready_with_waivers` is only a summary state; the actual accepted exception must
158
+ be carried as a structured Checkpoint Waiver. Stage-specific nuance belongs in
159
+ evidence, Source Gaps, Source TODOs, waivers, findings, and next actions rather
160
+ than in one-off status names.
161
+ _Avoid_: stage-specific status dialect, prose-only state, hidden blocker
162
+
163
+ **Checkpoint Waiver**:
164
+ A structured, attributed exception that lets a Readiness Checkpoint proceed
165
+ despite a known gap, TODO, or gate that would otherwise block the next stage. A
166
+ Checkpoint Waiver carries who accepted it, why, its scope, what it applies to,
167
+ when it was created, and either an expiry or review condition. Waivers are
168
+ operational and time-bound; they summarize into `ready_with_waivers` but do not
169
+ replace the underlying evidence, gap, TODO, or gate result. A lifecycle stage may
170
+ recommend or draft a waiver with evidence, but approval belongs to an
171
+ operator/run decision rather than the stage that found the exception.
172
+ _Avoid_: waived status only, permanent approval, hidden exception
173
+
174
+ **Evidence Quality**:
175
+ The declared strength of evidence behind a Workflow Finding, such as operator
176
+ report, artifact reference, artifact attachment, or system observation. Evidence
177
+ Quality lets useful signals enter the Learning Trail without pretending all
178
+ signals are QA Verdicts.
179
+ _Avoid_: confidence score, proof status, launch readiness
180
+
181
+ **Tiny Prompt**:
182
+ A skippable one-line Campaigns OS prompt that helps the operator notice the next
183
+ expected proof step or optionally record a Workflow Finding. Tiny Prompts must
184
+ not block lifecycle progress or turn into surveys.
185
+ _Avoid_: required survey, gate, checklist
186
+
187
+ **Finding Kind**:
188
+ The small operator-facing classification for a Workflow Finding, such as
189
+ positive signal, friction, missing prompt, blocker, docs gap, automation gap, or
190
+ idea. Finding Kind helps later aggregation without asking the operator to choose
191
+ from product-management categories.
192
+ _Avoid_: issue type, Linear label, priority
193
+
194
+ **Finding Author**:
195
+ The source of a Workflow Finding: a Campaigns OS Operator, an agent observing
196
+ artifacts and commands, or the system recording a deterministic lifecycle signal.
197
+ Agents may record observed workflow gaps, but they must not invent subjective
198
+ operator feedback.
199
+ _Avoid_: assignee, reporter, owner
200
+
201
+ **Campaigns OS Operator**:
202
+ A person or agent using Campaigns OS to assemble, adapt, prove, or repair a
203
+ campaign. Operators include internal campaign team members and future agency
204
+ users; they do not include shoppers or ordinary merchant-facing campaign approval
205
+ viewers.
206
+ _Avoid_: end user, shopper, customer
207
+
208
+ **Spec-Driven Campaign Development**:
209
+ The Campaigns OS operating model where an accurate CampaignSpec preserves the
210
+ campaign's core logic and makes build, checkout, upsell, and QA behavior
211
+ verifiable. Workflow Findings should help improve this Spec-centered flow rather
212
+ than collect unrelated product complaints.
213
+ _Avoid_: asset-first build, page-only development
214
+
215
+ **Design Source**:
216
+ The upstream creative/provenance input for campaign page presentation, such as
217
+ Figma frames, prepared HTML, a figma-sections export, existing Page Kit pages, or
218
+ agency-produced static source. Design Source owns visual composition, content
219
+ hierarchy, imagery, page-level copy, and brand presentation intent; it does not
220
+ own CampaignSpec commerce truth or SDK/runtime contracts.
221
+ _Avoid_: source of truth, design artifact, creative vibes
222
+
223
+ **Design Source Package**:
224
+ The public normalized Campaigns OS representation of a Design Source that Build
225
+ and Polish consume across source kinds. Its schema identity is
226
+ `campaign-design-source-package/v0`, reflecting upstream creative/provenance
227
+ context rather than runtime assembly proof. Every normal build has a Design
228
+ Source Package, with source-kind-specific depth, and a package may aggregate
229
+ multiple Design Sources for one campaign; it preserves provenance, presentation
230
+ intent, Source Gaps, Source TODOs, and source-side comparison references without
231
+ replacing the CampaignSpec or template runtime contracts. Its freshness is tracked
232
+ independently from CampaignSpec and build fingerprints because campaign logic
233
+ and creative source can change on different timelines. It is separate from the
234
+ Campaign Build Brief, which captures merchandising interpretation and business
235
+ questions. Missing Design Source Package or page-level mapping blocks a normal
236
+ build; explicit Source Gaps may produce a `ready_with_gaps` source-readiness
237
+ checkpoint and travel forward as known constraints, while Source TODOs mark
238
+ unfinished preparation unless explicitly waived. Agencies may provide loose
239
+ creative inputs or a prebuilt package, but Build and Polish consume the
240
+ normalized package contract. It is a new public artifact alongside producer
241
+ manifests such as `source-html-manifest`; source manifests may seed the package,
242
+ but they do not become the broader Design Source Package. During v0
243
+ compatibility, source preparation may synthesize a package from legacy
244
+ `packet.source_html` and source-html manifest data, but downstream Build and
245
+ Polish still consume the synthesized package rather than falling back to a
246
+ separate legacy source model. The package is referenced by the Build Packet,
247
+ Build Context, and Assembly Report through artifact references and fingerprints
248
+ rather than embedded wholesale.
249
+ _Avoid_: handoff notes, source adapter output, design brief
250
+
251
+ **Source Package Fingerprint**:
252
+ The material freshness identity of a Design Source Package, distinct from the
253
+ full artifact hash used for audit. Material source changes create a new Source
254
+ Package Fingerprint; administrative edits that do not change source readiness or
255
+ the comparison basis may change the full hash without changing the freshness
256
+ identity.
257
+ _Avoid_: build fingerprint, timestamp, chat-state marker
258
+
259
+ **Assembly Source Package Fingerprint**:
260
+ The Source Package Fingerprint recorded by Assembly for the design source
261
+ context used to produce the built campaign. If it differs from the current
262
+ Source Package Fingerprint, the build is stale before Polish begins.
263
+ _Avoid_: polish source proof, build hash, inferred source state
264
+
265
+ **Source Freshness Waiver**:
266
+ An exceptional Checkpoint Waiver that allows Polish to proceed when Assembly used
267
+ a stale or unrecorded Source Package Fingerprint. It must be explicit, scoped,
268
+ attributed, and visible in readiness readback; it does not waive missing Polish
269
+ Evidence.
270
+ _Avoid_: silent stale-source acceptance, permanent design waiver, implicit pass
271
+
272
+ **Material Source Change**:
273
+ A Design Source Package change that affects source readiness, Contribution
274
+ Coverage, provenance, presentation intent, accepted exceptions, or the visual
275
+ comparison basis for Build, Polish, or QA. Material Source Changes make evidence
276
+ against the prior Source Package Fingerprint stale.
277
+ _Avoid_: typo edit, generated readback rewrite, formatting churn
278
+
279
+ **Design Source Readback**:
280
+ A short human-readable summary carried with a Design Source Package so an
281
+ operator or future agent can quickly understand the package across sessions. The
282
+ readback summarizes included sources, Contribution Coverage, known Source Gaps
283
+ and Source TODOs, page mappings, screenshot/reference availability, and current
284
+ source-readiness state. It is owned by source preparation and generated from the
285
+ structured package fields; the structured fields remain authoritative. Later
286
+ lifecycle stages may reference it, but they do not rewrite it.
287
+ _Avoid_: authoritative prose, chat summary, replacement for structured package
288
+
289
+ **Source Readiness Summary**:
290
+ The generated top-level readiness summary carried by a Design Source Package. It
291
+ indexes the package's current source-readiness state, blocking reasons, gap/TODO
292
+ counts, waiver count, and generation time so `next`, status, and readback can
293
+ present source readiness consistently. Source readiness uses the sharper
294
+ checkpoint states `pending`, `blocked`, `ready`, `ready_with_gaps`, and
295
+ `ready_with_waivers`; it does not use `ready_with_warnings`. Source Gaps, Source
296
+ TODOs, proposed exceptions, and Checkpoint Waivers remain the authoritative
297
+ records; the summary is an index over them. Free-form notes may provide helpful
298
+ context, but notes do not affect readiness and must not hide blockers or
299
+ exceptions that should be typed. Low-confidence contribution mappings affect
300
+ readiness only when they undermine required page-level primary coverage; that
301
+ case becomes a Source TODO unless explicitly waived.
302
+ _Avoid_: authoritative duplicate, inferred-only readiness, prose-only readiness
303
+
304
+ **Stage Readback**:
305
+ A short human-readable summary owned by a lifecycle stage, such as Build,
306
+ Polish, Deploy, or QA, that explains that stage's evidence, unresolved work, and
307
+ next checkpoint implications. Stage Readbacks exist to feed the Campaign
308
+ Readiness Readback, not to become a patchwork of hidden artifacts. A Stage
309
+ Readback may reference the Design Source Readback, but it does not mutate source
310
+ preparation provenance.
311
+ _Avoid_: Design Source Readback edit, chat transcript, replacement for evidence
312
+
313
+ **Campaign Readiness Readback**:
314
+ The consolidated or just-in-time human presentation of a campaign's current
315
+ Readiness Checkpoint state. It draws from Design Source Readback, Stage
316
+ Readbacks, structured evidence, gaps, TODOs, waivers, proposed divergences,
317
+ deployment state, QA proof, and next actions so the operator can see what exists,
318
+ what matters now, and what remains blocked. Its primary form is generated live
319
+ from the latest authoritative artifacts; Run Records may snapshot it for audit.
320
+ `campaigns-os next` presents a concise just-in-time readback for the recommended
321
+ stage and blockers; run or campaign status presents the fuller campaign-level
322
+ readback. The readback has stable sections as well as prose, covering the current
323
+ checkpoint, readiness status, handled work, blockers, known gaps, proposed
324
+ exceptions, waivers, evidence references, and next actions. Evidence is
325
+ referenced and summarized, not embedded; detailed proof stays in the artifact
326
+ that owns it. Screenshots travel as references; UI surfaces may render thumbnails
327
+ or previews from those references, but the readback itself is not an image
328
+ bundle. It is a presentation layer over the authoritative artifacts, not another
329
+ independent source of truth.
330
+ _Avoid_: artifact pile, hidden sidecar, separate campaign journal
331
+
332
+ **Design Source Contribution**:
333
+ One source-kind-specific contribution to a Design Source Package, such as Figma
334
+ frames, prepared HTML, a figma-sections export, existing Page Kit pages, or
335
+ agency-produced static source. A template-stock contribution can intentionally
336
+ point to the Template Reference when no bespoke design overlay exists. A
337
+ contribution usually represents one producer or source group and may cover
338
+ multiple pages, sections, or surfaces; it carries its own provenance, coverage,
339
+ confidence, and source gaps or TODOs. When the contribution is renderable, it
340
+ carries screenshot references for available viewports or explicitly records why
341
+ they are unavailable. Those screenshot references describe source or reference
342
+ availability, not built campaign output.
343
+ _Avoid_: input chunk, source blob, extraction source
344
+
345
+ **Source Screenshot Reference**:
346
+ A source-side or reference-side visual proof attached to a Design Source
347
+ Contribution or Template Reference. It records what visual source was available
348
+ for comparison before Build or Polish; it is not a screenshot of the built
349
+ campaign output.
350
+ _Avoid_: polish screenshot, QA proof, built render
351
+
352
+ **Viewport Key**:
353
+ The shared campaign evidence label for a responsive capture size, used across
354
+ Design Source Package records, Polish Evidence, and QA observations. A Viewport
355
+ Key names the comparison lane, while exact dimensions and device details stay in
356
+ artifact metadata.
357
+ _Avoid_: device nickname, stage-specific size name, raw width label
358
+
359
+ **Contribution Coverage**:
360
+ The explicit claim of what a Design Source Contribution handles, such as pages,
361
+ sections, checkout styling, brand tokens, assets, or a template-stock baseline.
362
+ Contribution Coverage is separate from Surface Identity mapping: coverage says
363
+ what the source claims to provide, while mappings say where those claims attach
364
+ to the campaign. Contribution mappings reference canonical Surface Identity IDs
365
+ and carry contribution-specific details such as coverage role, confidence,
366
+ source references, and notes; they do not redefine CampaignSpec, route, or Page
367
+ Kit projection mappings. Contribution coverage role uses a small stable
368
+ vocabulary, while notes explain unusual cases. Contribution mapping confidence
369
+ uses a coarse `high`, `medium`, `low`, or `unknown` scale to express confidence
370
+ that the contribution maps to that surface and coverage role; it is not source
371
+ trust, design quality, or approval. Low confidence blocks only when the mapping
372
+ is required page-level primary coverage; low confidence on brand tokens,
373
+ reference-only, or other non-primary coverage is carried as a gap, note, or
374
+ readback signal as appropriate. Coverage makes handled, unhandled, and
375
+ intentionally absent source areas readable during the process so gaps can be
376
+ audited and improved over time.
377
+ _Avoid_: inferred coverage, implied full-page ownership, hidden gap
378
+
379
+ **Required Page-Level Coverage**:
380
+ The minimum Design Source Coverage for each active or mapped page in the current
381
+ build scope. A page satisfies it through a non-low-confidence primary design
382
+ contribution, an explicit Template Reference-backed template-baseline
383
+ contribution for template-stock pages, or an attributed Source Gap or approved
384
+ Checkpoint Waiver explaining why no primary design source exists.
385
+ _Avoid_: implicit template default, unowned page, hidden missing source
386
+
387
+ **Contribution Trust**:
388
+ The declared machine-readability level of a Design Source Contribution, such as
389
+ native, structured, rendered, or opaque. Contribution Trust says how much the OS
390
+ can infer from the source shape before human review; it is not launch readiness
391
+ or visual quality.
392
+ _Avoid_: quality score, approval, fidelity
393
+
394
+ **Source Gap**:
395
+ An attributed absence in Design Source Coverage that is allowed to travel
396
+ forward as a known constraint, such as an agency providing brand tokens but no
397
+ checkout composition. A Source Gap describes what the source does not claim to
398
+ provide; it is not unfinished preparation work. Polish may reference an accepted
399
+ Source Gap that already exists in the Design Source Package. When Polish
400
+ discovers a new absence, it records a proposed Source Gap or Source TODO
401
+ candidate for confirmation rather than accepting it silently. Source Gaps carry
402
+ scope and applies-to references; they attach to Surface Identity when possible,
403
+ but campaign-level gaps are valid when the absence applies across the campaign
404
+ or no specific surface is appropriate.
405
+ _Avoid_: intake TODO, hidden omission, silent waiver
406
+
407
+ **Source TODO**:
408
+ An unfinished Design Source Package preparation task, such as a missing mobile
409
+ screenshot for a renderable source or an unreadable reference that should be
410
+ captured before Build. A Source TODO means the package is not ready for normal
411
+ Build unless the TODO is explicitly waived with attribution. Source TODOs carry
412
+ scope and applies-to references; they should name affected surfaces when
413
+ possible, but campaign-level TODOs are valid for package-wide preparation work.
414
+ _Avoid_: accepted gap, source limitation, downstream polish task
415
+
416
+ **Source HTML Intake**:
417
+ The Campaigns OS step that normalizes prepared source HTML into a Build Packet
418
+ mapping. Source HTML Intake keeps producer paths, CampaignSpec pages, and Page
419
+ Kit target shape distinct: `source_html.pages[].path` records source provenance,
420
+ while `source_html.pages[].page_kit` records the target page file, route, CPK
421
+ `page_type`, and frontmatter projection. CampaignSpec `page_url` and legacy
422
+ `url` values are interpreted as Page Kit public routes during projection, not as
423
+ source filenames or opaque preview URLs. Source HTML Intake can populate a
424
+ Design Source Contribution from a producer-authored source-html manifest, but
425
+ the manifest remains an adapter input rather than the normalized Design Source
426
+ Package.
427
+ _Avoid_: copying manifest paths directly into Page Kit target paths, replacing
428
+ CampaignSpec routes with source filenames
429
+
430
+ **Adapter Decision Contract**:
431
+ The machine-readable record of how prepared source HTML was adapted into Page Kit
432
+ shape. It includes wrapper stripping, frontmatter policy, asset strategy,
433
+ script/style references, CTA routing, layout choice, template slice copying, and
434
+ commerce shell adoption so doctor can validate assembly state without relying on
435
+ chat history.
436
+ _Avoid_: undocumented adapter prose, hidden source conversion choices
437
+
438
+ **Source Divergence**:
439
+ An intentional recorded difference between Design Source intent and the built
440
+ campaign, usually because CampaignSpec/API, Template Reference, or SDK runtime
441
+ contracts own the surface. Source Divergence prevents Build and Polish from
442
+ mistaking a platform-safe difference for an unresolved fidelity defect; entries
443
+ may be added during intake, Build, or Polish and carry the stage that recorded
444
+ or confirmed them, plus optional links to the Design Source, CampaignSpec,
445
+ Template Reference, or build fingerprint that makes the divergence valid. Polish
446
+ may propose a Source Divergence when the mismatch becomes visible during review,
447
+ but that proposal remains unaccepted until an operator/run decision or the
448
+ relevant Build or Design Source owner confirms it. Accepted gaps, divergences,
449
+ and waivers must be explicit and attributed; Polish must not silently waive
450
+ source fidelity.
451
+ _Avoid_: bug, warning, ignored source
452
+
453
+ **Surface Identity**:
454
+ The stable page, section, surface, and viewport naming used to join Design Source
455
+ Package records, built Page Kit output, Polish Evidence, and QA observations.
456
+ Surface Identity exists both as a campaign-level vocabulary and as contribution
457
+ mapping claims: contribution mappings say which source informs which pages,
458
+ sections, or surfaces, while the campaign-level identity lets Build, Polish, and
459
+ QA refer to the same surface. Surface Identity should preserve campaign/source
460
+ semantics while also mapping to the Campaign Page Kit output shape Campaigns OS
461
+ assembles toward: page-level Page Kit mapping is expected early, while section
462
+ and runtime-surface output mapping may mature during Build. Page-level identity
463
+ is established during source preparation; Build may refine child section or
464
+ runtime-surface identity under mapped pages, while Polish and QA attach evidence
465
+ or observations to known identities instead of inventing new pages. `campaign`
466
+ is a reserved Surface Identity with `kind: "campaign"` for campaign-level gaps,
467
+ TODOs, waivers, and readback references; it is not Page Kit output. Surface
468
+ Identity IDs are stable human-semantic strings with labels and aliases. Opaque
469
+ source, DOM, or Page Kit identifiers may be recorded as external references or
470
+ aliases, but they are not the primary campaign vocabulary. Page-level Surface
471
+ Identity is distinct from CampaignSpec or Map Builder page IDs, custom page
472
+ names, public routes, producer page types, and Campaign Page Kit runtime
473
+ `page_type`; those values should be preserved as mapped attributes or aliases.
474
+ When a CampaignSpec page ID is stable and human-readable it may seed the primary
475
+ page-level Surface Identity. Otherwise source preparation derives the primary ID
476
+ from normalized page role plus order, while preserving the original page ID,
477
+ label, route, and Page Kit projection separately. The package carries Surface
478
+ Identity as a structured catalog of identity records, not as a bare string list,
479
+ so each identity can preserve labels, aliases, and mappings to source, spec,
480
+ route, and Page Kit projection values.
481
+ _Avoid_: screenshot label, prose anchor, selector-only identity
482
+
483
+ **Telemetry Consent**:
484
+ The machine/user-level opt-OUT that decides whether Run Records are remitted.
485
+ Consent belongs to the operator, not the campaign: changeable any time
486
+ (`telemetry status|on|off`) and overridable by the `CAMPAIGNS_OS_TELEMETRY`
487
+ env var (unknown values fail closed). Consent gates **remit only** — capture
488
+ is always local. The default is ON for the canonical NEXT endpoint only,
489
+ announced at remit time with the endpoint and the opt-out command; any other
490
+ endpoint (staging, self-hosted) stays fail-closed until explicitly
491
+ consented, and a malformed config file resolves OFF rather than letting the
492
+ default override an unreadable prior choice.
493
+ _Avoid_: per-finding approval, campaign-scoped consent, SILENT default-on
494
+ (the default is announced, never quiet)
495
+
496
+ **Remit**:
497
+ The consent-gated send of a Run Record to NEXT, over the same rails as QA verdict
498
+ publishing. Remit is non-fatal (a failed send never blocks or fails a run) and
499
+ idempotent on `run_id` (the endpoint upserts, so reruns do not double-count); the
500
+ local Run Record records `remit_attempted` / `remit_ok` / `error` so a dropped
501
+ send is visible. With consent on, remit is automatic and unsurprising because the
502
+ consent was explicit and up front.
503
+ _Avoid_: per-item contribution, background retry daemon, fail-the-run-on-error
504
+
505
+ **Data Boundary**:
506
+ What a remitted Run Record carries versus withholds. Carried: run identity (Map
507
+ ID, slug, template family — the join keys that make telemetry useful), structural
508
+ signal (doctor codes, spec-rule IDs, adapter decisions, QA disposition, finding
509
+ IDs), and artifact references (path, schema_version, hash, material fingerprint
510
+ where available). Minimized or omitted: absolute local paths
511
+ (relativized/hashed) and OS username. Never carried: raw artifact bodies
512
+ (CampaignSpec JSON, source HTML, full verdict/doctor/report bodies). This is
513
+ data minimization, not a secret-defense allowlist — runs use a
514
+ synthetic test customer and a publishable client-side key.
515
+ _Avoid_: raw artifact upload, shipping local paths/usernames, secret allowlist framing
516
+
517
+ **Improvement Surface**:
518
+ The part of Campaigns OS a signal should improve: `skill`, `cli`, `template`,
519
+ `design-source`, `docs`, `spec-rule`, or `platform`. Recorded as a list
520
+ (`surfaces[]`) with an optional `primary_surface` and confidence, because one
521
+ observation often touches more than one surface. This is the grown-up form of a
522
+ finding's `suggested_owner`.
523
+ _Avoid_: single-owner enum, Linear label, routing decision
524
+
525
+ **Expected Proof Step**:
526
+ The next verification action Campaigns OS should make visible to the operator
527
+ after a lifecycle stage, such as polish after build, preview deploy before QA,
528
+ or browser QA after deploy evidence. An Expected Proof Step is guidance, not an
529
+ automatic execution grant.
530
+ _Avoid_: auto-run, hidden gate, silent proof
531
+
532
+ **Polish Stage**:
533
+ The constrained post-Build repair and evidence stage for SDK-safe presentation
534
+ surfaces. Polish may repair visual skinning, source-fidelity, responsive layout,
535
+ and residue defects, but it must not change CampaignSpec/API truth, SDK-owned
536
+ runtime behavior, route topology, template shell adoption, or source provenance.
537
+ Polish may draft or recommend a Checkpoint Waiver with supporting evidence, and
538
+ it may propose source-reference updates for source preparation to accept, but it
539
+ does not approve readiness exceptions itself.
540
+ _Avoid_: second build, QA, launch approval
541
+
542
+ **Polish Evidence Package**:
543
+ The detailed evidence artifact produced by the Polish Stage, containing
544
+ comparison references, screenshots, issues, commands, and source/template
545
+ findings for the current build. It owns built-output and comparison screenshots
546
+ for that build fingerprint while referencing source-side screenshots from the
547
+ Design Source Package and baseline references from Template Reference.
548
+ Polish Evidence is current only when it matches both the current build
549
+ fingerprint and the current Source Package Fingerprint, unless a waiver records
550
+ why stale evidence is acceptable.
551
+ Unresolved issues in the package must carry a Polish Issue Classification so the
552
+ next checkpoint can distinguish repair work, source limits, accepted divergence,
553
+ waiver candidates, and work outside Polish. It includes a Polish Stage Readback
554
+ for session pickup, and that readback must be
555
+ available through the Campaign Readiness Readback rather than hidden as a
556
+ disconnected artifact. The Assembly Report indexes and summarizes this package
557
+ for lifecycle gating, and QA consumes the package for freshness and linkage
558
+ rather than re-running the full design-fidelity comparison.
559
+ _Avoid_: QA verdict, screenshot dump, assembly report replacement
560
+
561
+ **Polish Issue Classification**:
562
+ The required category for any unresolved Polish finding: `repair_needed`,
563
+ `source_gap`, `source_divergence`, `waiver_recommended`, or `out_of_scope`.
564
+ Classification prevents unresolved presentation work from collapsing into a
565
+ vague issue bucket; it tells the next Readiness Checkpoint whether to repair,
566
+ carry a Source Gap, accept a Source Divergence, seek waiver approval, or route
567
+ the work outside Polish. `repair_needed` blocks deploy and QA until it is
568
+ repaired, reclassified, or covered by an approved Checkpoint Waiver. A
569
+ `source_divergence` classification from Polish is proposed until confirmed by an
570
+ operator/run decision or the relevant Build or Design Source owner; a newly
571
+ discovered `source_gap` from Polish is also proposed unless it traces to an
572
+ accepted Source Gap in the Design Source Package.
573
+ _Avoid_: unresolved bucket, generic polish issue, hidden next action
574
+
575
+ **Doctor Check Registry**:
576
+ The ordered Campaigns OS list of named doctor checks. The Doctor Check Registry
577
+ keeps check identity, execution order, and skip predicates explicit so agents add
578
+ or inspect doctor behavior by choosing a deterministic check slot instead of
579
+ re-reading a long validation chain.
580
+ _Avoid_: ad hoc doctor order, hidden validation side effect, LLM-chosen check path
581
+
582
+ **Completeness Signal**:
583
+ A Workflow Finding that notes an expected lifecycle step was not evidenced, such
584
+ as build/polish evidence existing without a QA Verdict. A Completeness Signal
585
+ does not by itself mean the build failed.
586
+ _Avoid_: defect, launch blocker, failed stage
587
+
588
+ ## Example Dialogue
589
+
590
+ **Developer**: "The checkout worked because the CampaignSpec was accurate, but I
591
+ didn't realize I was supposed to run QA afterward."
592
+
593
+ **Domain Expert**: "Capture that as a Workflow Finding. The checkout behavior
594
+ belongs to the build and QA artifacts; the missing QA prompt is workflow
595
+ friction."
596
+
597
+ **Developer**: "Should the sidecar file create a Linear issue?"
598
+
599
+ **Domain Expert**: "No. The Findings Sidecar captures the local finding. Internal
600
+ ops can later aggregate and route it."
601
+
602
+ **Developer**: "This feedback is about the whole run, not one command."
603
+
604
+ **Domain Expert**: "Use Observation Stage `overall`. Most findings should name a
605
+ specific stage, but whole-workflow signals are allowed."
606
+
607
+ **Developer**: "Should I rewrite the findings file after I learn more?"
608
+
609
+ **Domain Expert**: "No. Add another entry to the Findings Journal. The journal is
610
+ append-only; later tooling can summarize it."
611
+
612
+ **Developer**: "Do I need Linear access to leave a finding?"
613
+
614
+ **Domain Expert**: "No. Finding Capture is local and public-package owned;
615
+ internal systems can ingest it later."
616
+
617
+ **Developer**: "Should this finding be an Assembly Report warning?"
618
+
619
+ **Domain Expert**: "Only if it is stage proof. Workflow observations belong in
620
+ the Learning Trail and can cross-reference formal artifacts."
621
+
622
+ **Developer**: "I only know the target repo and source type right now."
623
+
624
+ **Domain Expert**: "That's enough Campaign Run Identity for capture. Add more
625
+ context later if it becomes available."
626
+
627
+ **Developer**: "The operator reported the Spec-driven flow worked, but there
628
+ is no formal evidence packet."
629
+
630
+ **Domain Expert**: "Capture it with Evidence Quality `operator report`. Useful
631
+ human signal belongs in the Learning Trail."
632
+
633
+ **Developer**: "Can Campaigns OS ask for feedback after QA?"
634
+
635
+ **Domain Expert**: "Yes, as a Tiny Prompt. It should be one line and optional,
636
+ not another form to complete."
637
+
638
+ **Developer**: "Should skipping the prompt be recorded?"
639
+
640
+ **Domain Expert**: "No. Skipped Tiny Prompts are not Workflow Findings."
641
+
642
+ **Developer**: "How much classification do I need to do?"
643
+
644
+ **Domain Expert**: "Pick the closest Finding Kind and write a short summary.
645
+ The structure should prevent second-guessing, not create more of it."
646
+
647
+ **Developer**: "Can an agent add findings too?"
648
+
649
+ **Domain Expert**: "Yes, when it records observed workflow gaps. The Finding
650
+ Author should make clear whether the signal came from an operator, agent, or
651
+ system."
652
+
653
+ **Developer**: "Will agency users see this?"
654
+
655
+ **Domain Expert**: "Agency Campaigns OS Operators may see Tiny Prompts and
656
+ Workflow Findings. Shoppers and merchant-facing approval viewers should not."
657
+
658
+ **Developer**: "What made that operator's run work?"
659
+
660
+ **Domain Expert**: "Spec-Driven Campaign Development. When the CampaignSpec was
661
+ accurate, the core checkout and upsell logic had rails."
662
+
663
+ **Developer**: "Will Campaigns OS send my run to NEXT automatically?"
664
+
665
+ **Domain Expert**: "Only if you've opted in. Run Telemetry asks once, up front,
666
+ and remits the Run Record when consent is on. Capture is always local; consent
667
+ gates remit only, and you can turn it off any time with `telemetry off`."
668
+
669
+ **Developer**: "Could it include my source HTML?"
670
+
671
+ **Domain Expert**: "No. The Data Boundary carries structured signal, identity,
672
+ and artifact references — never raw artifact bodies, and it scrubs local paths
673
+ and your username. The patterns are the value, not the raw dumps."
674
+
675
+ **Developer**: "Should QA just run after build?"
676
+
677
+ **Domain Expert**: "No. Campaigns OS should show QA as the Expected Proof Step.
678
+ Browser QA still needs the deployed URL (and SDK-origin allowlist confirmation
679
+ for non-localhost), but typed-card test orders have no approval gate — they use
680
+ global test cards that bypass the gateway; depth is the only control."
681
+
682
+ **Developer**: "Build and polish finished, but there is no QA verdict."
683
+
684
+ **Domain Expert**: "That is a Completeness Signal unless someone claimed launch
685
+ readiness. Record the missing proof without calling the build failed."