@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/AGENTS.md ADDED
@@ -0,0 +1,204 @@
1
+ # Campaigns OS — agent entry point
2
+
3
+ You are probably an agent, or the tooling in front of one, trying to answer a
4
+ single question: **is it safe to work against this commit of Campaigns OS, and
5
+ what changed since the commit I last reviewed?**
6
+
7
+ This file is the canonical answer. It tells you what to read, in what order,
8
+ which paths you may depend on, and how to orient without running anything from
9
+ this repository.
10
+
11
+ ## The rule that shapes everything else
12
+
13
+ **Do not execute Campaigns OS code to decide whether to trust Campaigns OS.**
14
+
15
+ A target cannot supply its own trust decision. Everything you need to orient is
16
+ declarative data, readable straight out of Git objects at a resolved commit:
17
+ JSON contracts, a release ledger, a changelog, and JSON Schemas. No install, no
18
+ build, no checkout hooks, no CLI invocation. Reading a blob is safe; running a
19
+ script the target controls is not, however harmless the script looks.
20
+
21
+ `contracts/fixtures/orientation/hostile-target/` exists so you can prove your
22
+ reader honors this. It is a miniature target carrying Git hooks, an executable
23
+ script, and npm lifecycle scripts, each of which records a hit and exits 0. A
24
+ conforming orientation read of it produces a normal envelope and zero hits.
25
+
26
+ ## Canonical reading order
27
+
28
+ Read these at one immutable commit OID. Resolve the OID once and use it for
29
+ every read, so nothing shifts under you mid-orientation.
30
+
31
+ | # | Path | What it answers |
32
+ |---|---|---|
33
+ | 1 | `contracts/supported-surface.json` | What may I depend on, and at what surface version? |
34
+ | 2 | `contracts/release-ledger.json` | What agent-relevant changes happened, in order? |
35
+ | 3 | `CHANGELOG.md` | The human narrative each ledger entry links to, one-to-one. |
36
+ | 4 | `contracts/orientation-limits.v1.json` | How much am I allowed to read before refusing? |
37
+ | 5 | `contracts/orientation-reason-codes.v1.json` | What may I report, and what is the remedy for each? |
38
+ | 6 | `schemas/campaigns-os-tooling-orientation.v1.schema.json` | The envelope shape I must produce. |
39
+ | 7 | `schemas/campaigns-os-release-ledger.v1.schema.json` | The ledger shape I am reading. |
40
+ | 8 | `contracts/agent-relevant-change-policy.v1.json` | What this repository counts as agent-relevant, and why a path was excluded. |
41
+ | 9 | `docs/orientation-contract-reference.md` | Every enum, reason code, remedy, bound, and a worked example per terminal outcome. |
42
+
43
+ Apply the limits from step 4 **before** you finish assembling. Exceeding one is
44
+ a refusal with reason code `orientation_too_large`. Never truncate: a partial
45
+ view of a release is worse than no view, because you cannot tell which part you
46
+ are missing.
47
+
48
+ Orienting on a commit tells you whether it is safe to work against. Turning that
49
+ commit into a runtime you can actually use is a separate question with its own
50
+ contract, and you only need it if you are preparing one:
51
+
52
+ | Path | What it answers |
53
+ |---|---|
54
+ | `contracts/runtime-recipe.campaigns-os-node-v1.json` | Exactly which commands prepare a runtime, under which tool versions, network policy, inputs, output checks, and bounds. |
55
+ | `schemas/campaigns-os-runtime-recipe.v1.schema.json` | The recipe shape, and which kinds, revisions, and safety-critical enums are accepted. |
56
+ | `docs/runtime-readiness.md` | The same contract in prose, generated from it. |
57
+
58
+ Execute the enumerated commands and nothing else; never assemble a command from
59
+ repository data. An unrecognized recipe kind, revision, or safety-critical enum
60
+ is a refusal, not a value to interpret. And a prepared runtime can build and
61
+ type-check but **cannot run browser QA** — preparation suppresses lifecycle
62
+ scripts, which is also what suppresses the browser download.
63
+
64
+ The recipe describes preparing a runtime from a **checkout**. The supported
65
+ way to *run* the toolkit without a checkout is as a **pinned devDependency of
66
+ the campaign folder** (a page-kit project): `npm i -D
67
+ "github:NextCommerceCo/campaigns-os#<sha>"` there, then `npx campaigns-os …`
68
+ from that folder. The same pin discipline applies — the sha is the one you
69
+ oriented on — and npm records the resolved commit in that folder's
70
+ `package.json` and `package-lock.json`, so CI and the deploy host install the
71
+ same commit and `tooling status` reads the pin back (`Install mode: package
72
+ install …`). It runs the package's own lifecycle script at install time, so it
73
+ is not a recipe execution and makes no claim under the recipe's output
74
+ checks. Every command the toolkit prints for you to copy is spelled for the
75
+ install it came from (`npx campaigns-os …` there). A recipe kind for package
76
+ installs is not published yet.
77
+
78
+ ## Supported versus internal
79
+
80
+ `contracts/supported-surface.json` is the machine authority and
81
+ [`docs/supported-surface.md`](docs/supported-surface.md) is its prose twin.
82
+
83
+ - **Supported** — the `hashed{}` map, the `named[]` list, `cli_commands`,
84
+ `package_exports`, and `bin`. You may pin these, verify their bytes, and build
85
+ behavior on them. A change here is versioned, and it is loud.
86
+ - **Internal** — everything else: `src/**`, `scripts/**`, `examples/**`,
87
+ `prompts/**`, `agents/**`, and `contracts/**` other than the entries the
88
+ manifest names. Read them for context if you like. Never depend on them. A
89
+ consumer manifest that pins an internal path is invalid, and it will break
90
+ without notice or ceremony.
91
+
92
+ The orientation artifacts you consume are all on the supported surface: the
93
+ ledger, the three contract files, both schemas, the changelog, this file, the
94
+ generated reference, the authoring guide, and the fixtures under
95
+ `contracts/fixtures/orientation/envelope/` and
96
+ `contracts/fixtures/orientation/hostile-target/`.
97
+
98
+ Anything under `contracts/fixtures/` that the manifest does *not* name is this
99
+ repository's own test data. It is not yours to depend on.
100
+
101
+ ## Releases are recorded twice, deliberately
102
+
103
+ `CHANGELOG.md` alone is not enough for you. It moves when the surface version
104
+ moves, and a great many changes that matter to an agent — a renamed CLI flag, a
105
+ rewritten contract doc, a new skill, a changed runtime input — leave the surface
106
+ version untouched.
107
+
108
+ So every agent-relevant change also gets a **release-ledger** entry, and the two
109
+ are checked against each other in both directions by
110
+ `scripts/check-release-ledger.mjs`:
111
+
112
+ 1. Every agent-relevant changed path has exactly one ledger change item.
113
+ 2. Every ledger change item maps to a classified change, or belongs to an
114
+ explicit reviewed amendment.
115
+ 3. A supported-surface version change owes exactly one entry and one changelog
116
+ section.
117
+ 4. History is append-only. A correction ships as a new amendment entry;
118
+ rewriting an old one fails CI.
119
+
120
+ Authoring rules and worked pass/fail examples:
121
+ [`docs/release-ledger-authoring-guide.md`](docs/release-ledger-authoring-guide.md).
122
+
123
+ ### Ledger entries carry no commit, on purpose
124
+
125
+ An entry cannot name the commit that contains it without being rewritten after
126
+ that commit exists, which is exactly the after-the-fact editing the append-only
127
+ rule forbids. The schema rejects any commit-shaped property.
128
+
129
+ Derive the introducing commit yourself, from history at the target OID: walk the
130
+ commits that touched `contracts/release-ledger.json` oldest-first and credit each
131
+ entry id to the first commit whose ledger blob contains it. Merge commits need
132
+ no special case. If an entry arrived on a side branch, that commit is credited;
133
+ if it was first assembled while resolving a merge, the merge commit is. Both are
134
+ the truthful answer.
135
+
136
+ Two properties of that walk are load-bearing:
137
+
138
+ - **Walk the full history ending at the target**, not a slice starting at some
139
+ base. An entry introduced before your base was introduced outside the slice,
140
+ and a sliced walk either loses it or credits the slice's first ledger-touching
141
+ commit with introducing everything that already existed.
142
+ - **Disable history simplification** (`git rev-list --full-history --reverse
143
+ --topo-order <oid> -- contracts/release-ledger.json`). Git's default walk drops
144
+ commits that are TREESAME to a parent along the path, which can hide the
145
+ side-branch commit that actually introduced an entry and shift the credit to
146
+ the merge.
147
+
148
+ ## Mixed versions and the legacy boundary
149
+
150
+ You and this repository are not upgraded at the same moment, so decide
151
+ explicitly rather than optimistically.
152
+
153
+ - **Unknown orientation schema id** — fail closed. Do not attempt a partial
154
+ parse of a contract you do not understand.
155
+ - **Unknown additive fields inside a recognized v1 schema** — accept and
156
+ preserve them without interpreting them. Every object in the orientation and
157
+ ledger schemas permits additional properties so an older consumer is not
158
+ stranded by producer-first rollout. This does not relax known semantics:
159
+ required fields, their declared types, and known safety-critical enums still
160
+ validate exactly. Additive data cannot grant authority or change the meaning
161
+ of a known field merely because it is present.
162
+ - **Unknown enum value in a safety-critical position** (a disposition, a reason
163
+ code, a compatibility result) — fail closed. Silently coercing an unrecognized
164
+ refusal into a success is the worst available outcome.
165
+ - **A commit with no orientation contract** — that commit predates this contract.
166
+ Report `orientation_contract_missing` and refuse, unless it is the exact
167
+ baseline your operator reviewed, in which case report `legacy_baseline` and
168
+ proceed only against the checkout that was already verified. Never fabricate a
169
+ `surface_version` for a commit that predates supported surfaces.
170
+ - **Target surface outside your accepted range** — `surface_incompatible`.
171
+ Upgrade yourself, or pin a reviewed baseline inside your range.
172
+
173
+ ## The axes are independent
174
+
175
+ Report integrity, freshness, compatibility, runtime readiness, and orientation
176
+ separately. Collapsing them into one boolean is how a session ends up bound to a
177
+ checkout that is source-current and runtime-stale, or contract-compatible and
178
+ three releases behind.
179
+
180
+ The envelope keeps them apart by construction: `repository` and `request` carry
181
+ integrity, `freshness` carries currency, `surface` carries compatibility,
182
+ `runtime` carries generated-artifact readiness, and `release_ledger` plus
183
+ `changelog` carry orientation. `outcome` is the single terminal disposition you
184
+ reached, not a summary that overwrites the axes.
185
+
186
+ ## Generated runtime
187
+
188
+ This repository builds `campaign-spec/dist` through its ordinary Node dependency
189
+ and build flow. Source freshness is **not** runtime readiness: a checkout can be
190
+ at the right commit with absent or stale generated output.
191
+
192
+ The `runtime` group is where you report that. Preparation happens in a fresh,
193
+ not-yet-active generation and never in place over a generation something is
194
+ already using. The declarative preparation recipe contract is a separate change
195
+ and is not published yet; until it is, `runtime.recipe_id` is `null` and you
196
+ determine readiness from the source fingerprint and the generated state.
197
+
198
+ ## Human entry points
199
+
200
+ - [`README.md`](README.md) — what this toolkit is.
201
+ - [`CONTEXT.md`](CONTEXT.md) — the build flow in one page.
202
+ - [`docs/supported-surface.md`](docs/supported-surface.md) — the compatibility
203
+ promise, in prose.
204
+ - [`docs/versioning.md`](docs/versioning.md) — the independent version lines.