@nextcommerce/campaigns-os 1.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. package/AGENTS.md +204 -0
  2. package/CHANGELOG.md +5002 -0
  3. package/CONTEXT.md +685 -0
  4. package/LICENSE +202 -0
  5. package/NOTICE +4 -0
  6. package/README.md +368 -0
  7. package/agents/claude/CLAUDE.md +32 -0
  8. package/agents/codex/AGENTS.md +27 -0
  9. package/agents/copilot/copilot-instructions.md +14 -0
  10. package/agents/cursor/campaigns-os.mdc +13 -0
  11. package/bin/campaigns-os.mjs +38 -0
  12. package/campaign-spec/README.md +138 -0
  13. package/campaign-spec/dist/analytics-vocabulary.d.ts +47 -0
  14. package/campaign-spec/dist/analytics-vocabulary.js +74 -0
  15. package/campaign-spec/dist/index.d.ts +40 -0
  16. package/campaign-spec/dist/index.js +77 -0
  17. package/campaign-spec/dist/normalize.d.ts +22 -0
  18. package/campaign-spec/dist/normalize.js +41 -0
  19. package/campaign-spec/dist/routing.d.ts +190 -0
  20. package/campaign-spec/dist/routing.js +263 -0
  21. package/campaign-spec/dist/rules/analytics-contract-shape.d.ts +42 -0
  22. package/campaign-spec/dist/rules/analytics-contract-shape.js +303 -0
  23. package/campaign-spec/dist/rules/assembly-hints-shape.d.ts +42 -0
  24. package/campaign-spec/dist/rules/assembly-hints-shape.js +191 -0
  25. package/campaign-spec/dist/rules/campaign-metadata.d.ts +14 -0
  26. package/campaign-spec/dist/rules/campaign-metadata.js +40 -0
  27. package/campaign-spec/dist/rules/checkout-has-success-url.d.ts +31 -0
  28. package/campaign-spec/dist/rules/checkout-has-success-url.js +66 -0
  29. package/campaign-spec/dist/rules/cycle-detection.d.ts +12 -0
  30. package/campaign-spec/dist/rules/cycle-detection.js +141 -0
  31. package/campaign-spec/dist/rules/design-source-shape.d.ts +29 -0
  32. package/campaign-spec/dist/rules/design-source-shape.js +142 -0
  33. package/campaign-spec/dist/rules/downsell-without-upsell.d.ts +11 -0
  34. package/campaign-spec/dist/rules/downsell-without-upsell.js +40 -0
  35. package/campaign-spec/dist/rules/exit-intent-validation.d.ts +23 -0
  36. package/campaign-spec/dist/rules/exit-intent-validation.js +147 -0
  37. package/campaign-spec/dist/rules/funnel-count.d.ts +9 -0
  38. package/campaign-spec/dist/rules/funnel-count.js +37 -0
  39. package/campaign-spec/dist/rules/funnel-hypothesis-length.d.ts +22 -0
  40. package/campaign-spec/dist/rules/funnel-hypothesis-length.js +60 -0
  41. package/campaign-spec/dist/rules/funnel-identity.d.ts +15 -0
  42. package/campaign-spec/dist/rules/funnel-identity.js +57 -0
  43. package/campaign-spec/dist/rules/funnel-weight-sum.d.ts +20 -0
  44. package/campaign-spec/dist/rules/funnel-weight-sum.js +66 -0
  45. package/campaign-spec/dist/rules/index.d.ts +69 -0
  46. package/campaign-spec/dist/rules/index.js +131 -0
  47. package/campaign-spec/dist/rules/offer-ref-integrity.d.ts +13 -0
  48. package/campaign-spec/dist/rules/offer-ref-integrity.js +59 -0
  49. package/campaign-spec/dist/rules/package-pricing-sanity.d.ts +12 -0
  50. package/campaign-spec/dist/rules/package-pricing-sanity.js +42 -0
  51. package/campaign-spec/dist/rules/page-count.d.ts +11 -0
  52. package/campaign-spec/dist/rules/page-count.js +31 -0
  53. package/campaign-spec/dist/rules/page-id-uniqueness.d.ts +14 -0
  54. package/campaign-spec/dist/rules/page-id-uniqueness.js +47 -0
  55. package/campaign-spec/dist/rules/promo-code-input-validation.d.ts +8 -0
  56. package/campaign-spec/dist/rules/promo-code-input-validation.js +126 -0
  57. package/campaign-spec/dist/rules/promo-codes-shape.d.ts +30 -0
  58. package/campaign-spec/dist/rules/promo-codes-shape.js +187 -0
  59. package/campaign-spec/dist/rules/route-field-ignored-for-page-type.d.ts +33 -0
  60. package/campaign-spec/dist/rules/route-field-ignored-for-page-type.js +81 -0
  61. package/campaign-spec/dist/rules/route-target-resolves.d.ts +32 -0
  62. package/campaign-spec/dist/rules/route-target-resolves.js +112 -0
  63. package/campaign-spec/dist/rules/schema-version.d.ts +21 -0
  64. package/campaign-spec/dist/rules/schema-version.js +53 -0
  65. package/campaign-spec/dist/rules/sdk-version.d.ts +26 -0
  66. package/campaign-spec/dist/rules/sdk-version.js +96 -0
  67. package/campaign-spec/dist/rules/shipping-countries-shape.d.ts +10 -0
  68. package/campaign-spec/dist/rules/shipping-countries-shape.js +30 -0
  69. package/campaign-spec/dist/rules/shipping-methods-present.d.ts +10 -0
  70. package/campaign-spec/dist/rules/shipping-methods-present.js +26 -0
  71. package/campaign-spec/dist/rules/store-profile-shape.d.ts +30 -0
  72. package/campaign-spec/dist/rules/store-profile-shape.js +127 -0
  73. package/campaign-spec/dist/rules/thank-you-requirement.d.ts +16 -0
  74. package/campaign-spec/dist/rules/thank-you-requirement.js +50 -0
  75. package/campaign-spec/dist/rules/unknown-top-level-fields.d.ts +28 -0
  76. package/campaign-spec/dist/rules/unknown-top-level-fields.js +114 -0
  77. package/campaign-spec/dist/rules/upsell-has-packages.d.ts +9 -0
  78. package/campaign-spec/dist/rules/upsell-has-packages.js +35 -0
  79. package/campaign-spec/dist/rules/upsell-routing-complete.d.ts +10 -0
  80. package/campaign-spec/dist/rules/upsell-routing-complete.js +45 -0
  81. package/campaign-spec/dist/rules/upsell-without-checkout.d.ts +11 -0
  82. package/campaign-spec/dist/rules/upsell-without-checkout.js +44 -0
  83. package/campaign-spec/dist/rules/variant-labels-shape.d.ts +28 -0
  84. package/campaign-spec/dist/rules/variant-labels-shape.js +86 -0
  85. package/campaign-spec/dist/sdk-version-parse.d.ts +43 -0
  86. package/campaign-spec/dist/sdk-version-parse.js +62 -0
  87. package/campaign-spec/dist/types.d.ts +674 -0
  88. package/campaign-spec/dist/types.js +40 -0
  89. package/campaign-spec/package.json +12 -0
  90. package/compatibility.json +25 -0
  91. package/contracts/agent-relevant-change-policy.v1.json +111 -0
  92. package/contracts/brand-theme-source-defaults.figma-sections-export.v0.json +32 -0
  93. package/contracts/brand-theme-target-tokens.next-core.v0.json +65 -0
  94. package/contracts/campaign-cart-checkout-field-contract.v0.json +45 -0
  95. package/contracts/campaign-cart-sdk-support-policy.v0.json +11 -0
  96. package/contracts/commerce-surface-catalog.json +2452 -0
  97. package/contracts/fixtures/orientation/canonicalization/v1.json +34 -0
  98. package/contracts/fixtures/orientation/envelope/current.json +95 -0
  99. package/contracts/fixtures/orientation/envelope/freshness_unknown.json +97 -0
  100. package/contracts/fixtures/orientation/envelope/legacy_baseline.json +95 -0
  101. package/contracts/fixtures/orientation/envelope/orientation_available.json +136 -0
  102. package/contracts/fixtures/orientation/envelope/recovered_interrupted_update.json +136 -0
  103. package/contracts/fixtures/orientation/envelope/refused.json +100 -0
  104. package/contracts/fixtures/orientation/envelope/restart_required.json +137 -0
  105. package/contracts/fixtures/orientation/envelope/updated.json +135 -0
  106. package/contracts/fixtures/orientation/hostile-target/README.md +61 -0
  107. package/contracts/fixtures/orientation/hostile-target/manifest.json +82 -0
  108. package/contracts/fixtures/orientation/hostile-target/repo/CHANGELOG.md +18 -0
  109. package/contracts/fixtures/orientation/hostile-target/repo/bin/intended.mjs +12 -0
  110. package/contracts/fixtures/orientation/hostile-target/repo/bin/tripwire.mjs +15 -0
  111. package/contracts/fixtures/orientation/hostile-target/repo/contracts/release-ledger.json +48 -0
  112. package/contracts/fixtures/orientation/hostile-target/repo/contracts/supported-surface.json +17 -0
  113. package/contracts/fixtures/orientation/hostile-target/repo/docs/example-contract.md +13 -0
  114. package/contracts/fixtures/orientation/hostile-target/repo/hooks/post-checkout +5 -0
  115. package/contracts/fixtures/orientation/hostile-target/repo/hooks/post-merge +5 -0
  116. package/contracts/fixtures/orientation/hostile-target/repo/hooks/pre-commit +5 -0
  117. package/contracts/fixtures/orientation/hostile-target/repo/hostile-dependency-tripwire/package.json +15 -0
  118. package/contracts/fixtures/orientation/hostile-target/repo/hostile-dependency-tripwire/tripwire.mjs +9 -0
  119. package/contracts/fixtures/orientation/hostile-target/repo/package.json +20 -0
  120. package/contracts/fixtures/orientation/hostile-target/repo/schemas/example.v0.schema.json +15 -0
  121. package/contracts/fixtures/orientation/release-gate/cases.json +1073 -0
  122. package/contracts/fixtures/runtime-recipe/accept/current.json +299 -0
  123. package/contracts/fixtures/runtime-recipe/accept/minimal.json +294 -0
  124. package/contracts/fixtures/runtime-recipe/dist-states.json +51 -0
  125. package/contracts/fixtures/runtime-recipe/manifest.json +85 -0
  126. package/contracts/fixtures/runtime-recipe/reject/advisory-enforcement.json +299 -0
  127. package/contracts/fixtures/runtime-recipe/reject/allowlist-without-hosts.json +297 -0
  128. package/contracts/fixtures/runtime-recipe/reject/committed-output-claim.json +299 -0
  129. package/contracts/fixtures/runtime-recipe/reject/engines-disagreement-warns.json +299 -0
  130. package/contracts/fixtures/runtime-recipe/reject/lifecycle-scripts-enabled.json +299 -0
  131. package/contracts/fixtures/runtime-recipe/reject/missing-required-field.json +251 -0
  132. package/contracts/fixtures/runtime-recipe/reject/unknown-kind.json +299 -0
  133. package/contracts/fixtures/runtime-recipe/reject/unknown-network-policy.json +299 -0
  134. package/contracts/fixtures/runtime-recipe/reject/unknown-output-check.json +310 -0
  135. package/contracts/fixtures/runtime-recipe/reject/unknown-revision.json +299 -0
  136. package/contracts/fixtures/runtime-recipe/reject/unknown-step-id.json +299 -0
  137. package/contracts/fixtures/runtime-recipe/reject/unperformable-check-skipped.json +299 -0
  138. package/contracts/fixtures/runtime-recipe/reject/unpinned-lockfile.json +299 -0
  139. package/contracts/fixtures/sidecar-bundle/production-shaped/.campaign-runtime/assembly-report.json +180 -0
  140. package/contracts/fixtures/sidecar-bundle/production-shaped/.campaign-runtime/build-context.json +115 -0
  141. package/contracts/fixtures/sidecar-bundle/production-shaped/.campaign-runtime/doctor-output.json +29 -0
  142. package/contracts/fixtures/sidecar-bundle/production-shaped/.campaign-runtime/qa-verdict.json +27 -0
  143. package/contracts/fixtures/sidecar-bundle/production-shaped/campaign-runtime.build.json +141 -0
  144. package/contracts/migration-sidecar-bundle.v0.json +149 -0
  145. package/contracts/orientation-limits.v1.json +41 -0
  146. package/contracts/orientation-reason-codes.v1.json +196 -0
  147. package/contracts/private-template-sources.json +8 -0
  148. package/contracts/release-ledger.json +4598 -0
  149. package/contracts/reserved-skill-names.json +13 -0
  150. package/contracts/runtime-recipe.campaigns-os-node-v1.json +299 -0
  151. package/contracts/supported-surface.json +180 -0
  152. package/contracts/template-brand-contract.apollo-mv-single-step.v0.json +27 -0
  153. package/contracts/template-brand-contract.apollo.v0.json +27 -0
  154. package/contracts/template-brand-contract.demeter.v0.json +27 -0
  155. package/contracts/template-brand-contract.olympus-mv-single-step.v0.json +27 -0
  156. package/contracts/template-brand-contract.olympus-mv-two-step.v0.json +28 -0
  157. package/contracts/template-brand-contract.olympus.v0.json +27 -0
  158. package/contracts/template-brand-contract.shared-commerce.v0.json +190 -0
  159. package/contracts/template-brand-contract.shop-single-step.v0.json +27 -0
  160. package/contracts/template-brand-contract.shop-three-step.v0.json +29 -0
  161. package/contracts/template-slot-manifest.apollo-mv-single-step.v0.json +14 -0
  162. package/contracts/template-slot-manifest.apollo.v0.json +12 -0
  163. package/contracts/template-slot-manifest.demeter.v0.json +30 -0
  164. package/contracts/template-slot-manifest.olympus-mv-single-step.v0.json +14 -0
  165. package/contracts/template-slot-manifest.olympus-mv-two-step.v0.json +15 -0
  166. package/contracts/template-slot-manifest.olympus.v0.json +12 -0
  167. package/contracts/template-slot-manifest.shared-content-core.v0.json +4254 -0
  168. package/contracts/template-slot-manifest.shop-single-step.v0.json +47 -0
  169. package/contracts/template-slot-manifest.shop-three-step.v0.json +33 -0
  170. package/docs/brand-theme-bridge.md +159 -0
  171. package/docs/build-packet.md +1300 -0
  172. package/docs/campaign-build-brief.md +145 -0
  173. package/docs/campaign-standardization-report.md +329 -0
  174. package/docs/campaigns-os-build-flow.md +117 -0
  175. package/docs/design-source-package.md +784 -0
  176. package/docs/legacy-migration.md +58 -0
  177. package/docs/migration-sidecar-bundle.md +139 -0
  178. package/docs/orientation-contract-reference.md +1220 -0
  179. package/docs/polish-evidence.md +502 -0
  180. package/docs/qa-and-test-orders.md +1691 -0
  181. package/docs/release-ledger-authoring-guide.md +274 -0
  182. package/docs/runtime-readiness.md +211 -0
  183. package/docs/supported-surface.md +83 -0
  184. package/docs/versioning.md +55 -0
  185. package/docs/workflow-findings-sidecar.md +588 -0
  186. package/package.json +135 -0
  187. package/prompts/first-build.md +27 -0
  188. package/prompts/friction-log.md +30 -0
  189. package/schemas/campaign-build-brief.v1.schema.json +149 -0
  190. package/schemas/campaign-design-source-package.v0.schema.json +697 -0
  191. package/schemas/campaign-runtime-assembly-report.v0.schema.json +390 -0
  192. package/schemas/campaign-runtime-build-context.v0.schema.json +339 -0
  193. package/schemas/campaign-runtime-build-packet.v0.schema.json +452 -0
  194. package/schemas/campaign-spec.v4.schema.json +582 -0
  195. package/schemas/campaigns-os-doctor-output.v0.schema.json +43 -0
  196. package/schemas/campaigns-os-legacy-migration-inventory.v0.schema.json +112 -0
  197. package/schemas/campaigns-os-legacy-provisioning-plan.v0.schema.json +38 -0
  198. package/schemas/campaigns-os-legacy-provisioning-receipt.v0.schema.json +57 -0
  199. package/schemas/campaigns-os-qa-verdict-sidecar.v0.schema.json +150 -0
  200. package/schemas/campaigns-os-qa-verdict.v0.schema.json +438 -0
  201. package/schemas/campaigns-os-release-ledger.v1.schema.json +162 -0
  202. package/schemas/campaigns-os-run-record.v0.schema.json +343 -0
  203. package/schemas/campaigns-os-runtime-recipe.v1.schema.json +313 -0
  204. package/schemas/campaigns-os-sidecar-bundle-conformance.v0.schema.json +78 -0
  205. package/schemas/campaigns-os-tooling-orientation.v1.schema.json +381 -0
  206. package/schemas/campaigns-os-workflow-finding.v0.schema.json +134 -0
  207. package/schemas/source-html-manifest.v0.schema.json +252 -0
  208. package/skills/next-campaigns-build/SKILL.md +73 -0
  209. package/skills/next-campaigns-os/SKILL.md +101 -0
  210. package/skills/next-campaigns-os/references/session-intake.md +160 -0
  211. package/skills/next-campaigns-os-setup/SKILL.md +22 -0
  212. package/skills/next-campaigns-polish/SKILL.md +145 -0
  213. package/skills/next-campaigns-qa/SKILL.md +92 -0
  214. package/skills.json +56 -0
  215. package/skills.sh +64 -0
  216. package/src/adapter-decision-contract.mjs +333 -0
  217. package/src/brand-theme.mjs +1151 -0
  218. package/src/browser-launch.mjs +79 -0
  219. package/src/build-brief.mjs +781 -0
  220. package/src/built-site-scope.mjs +312 -0
  221. package/src/campaign-ecosystem.mjs +734 -0
  222. package/src/campaign-identity.mjs +405 -0
  223. package/src/campaign-workspace.mjs +127 -0
  224. package/src/checkpoint-waiver.mjs +302 -0
  225. package/src/cli.mjs +13442 -0
  226. package/src/commercial-journey.mjs +1119 -0
  227. package/src/commercial-parity.mjs +965 -0
  228. package/src/consent.mjs +347 -0
  229. package/src/content-residue.mjs +322 -0
  230. package/src/deadline.mjs +81 -0
  231. package/src/design-source-package.mjs +2604 -0
  232. package/src/deviation.mjs +107 -0
  233. package/src/doctor-check-registry.mjs +49 -0
  234. package/src/doctor-sidecar.mjs +106 -0
  235. package/src/finding-cause.mjs +557 -0
  236. package/src/findings.mjs +326 -0
  237. package/src/fs-identity.mjs +68 -0
  238. package/src/gate-actions.mjs +105 -0
  239. package/src/html-scan.mjs +53 -0
  240. package/src/install-mode.mjs +272 -0
  241. package/src/legacy-migration.d.ts +128 -0
  242. package/src/legacy-migration.mjs +510 -0
  243. package/src/lifecycle.mjs +338 -0
  244. package/src/local-proof.mjs +401 -0
  245. package/src/map-pin-writeback.mjs +210 -0
  246. package/src/orchestration-stage-contract.mjs +81 -0
  247. package/src/package-install-fixture.mjs +33 -0
  248. package/src/page-kit-build-summary.mjs +175 -0
  249. package/src/page-kit-campaign-config.mjs +57 -0
  250. package/src/page-kit-sdk-version.mjs +392 -0
  251. package/src/page-kit-store-profile.mjs +369 -0
  252. package/src/page-kit-sync.mjs +162 -0
  253. package/src/polish-browser.mjs +867 -0
  254. package/src/polish-capture.mjs +1094 -0
  255. package/src/polish-deadline.mjs +51 -0
  256. package/src/polish-gate.mjs +739 -0
  257. package/src/polish-node.mjs +639 -0
  258. package/src/polish-page-load.mjs +1100 -0
  259. package/src/private-template-source.mjs +237 -0
  260. package/src/proof-policy.mjs +82 -0
  261. package/src/qa-analytics-correctness.mjs +307 -0
  262. package/src/qa-analytics-errors.mjs +38 -0
  263. package/src/qa-analytics-parity.mjs +699 -0
  264. package/src/qa-binding-evidence.mjs +140 -0
  265. package/src/qa-browser.mjs +6608 -0
  266. package/src/qa-cart-entry.mjs +406 -0
  267. package/src/qa-commercial-parity.mjs +641 -0
  268. package/src/qa-node.mjs +3620 -0
  269. package/src/qa-order-bump.mjs +381 -0
  270. package/src/qa-parity-capture.mjs +428 -0
  271. package/src/qa-parity-fixture.mjs +359 -0
  272. package/src/qa-publish.mjs +362 -0
  273. package/src/qa-purchase-data-layer.mjs +263 -0
  274. package/src/qa-route-probe.mjs +272 -0
  275. package/src/qa-sidecar.mjs +188 -0
  276. package/src/qa-test-order-topology.mjs +207 -0
  277. package/src/qa-url-privacy.mjs +13 -0
  278. package/src/qa-verdict-discovery.mjs +192 -0
  279. package/src/qa-verdict-publish.mjs +105 -0
  280. package/src/qa-verdict.mjs +287 -0
  281. package/src/remit.mjs +388 -0
  282. package/src/repo-scan.mjs +83 -0
  283. package/src/route-identity.mjs +133 -0
  284. package/src/run-record-closeout.mjs +229 -0
  285. package/src/run-record.mjs +839 -0
  286. package/src/run-session.mjs +226 -0
  287. package/src/runtime-state-ignore.mjs +113 -0
  288. package/src/sdk-attribute-index.mjs +212 -0
  289. package/src/sdk-markup.mjs +358 -0
  290. package/src/sdk-meta-tags.mjs +52 -0
  291. package/src/shell-token.mjs +7 -0
  292. package/src/sidecar-bundle.mjs +399 -0
  293. package/src/source-asset-crawl.mjs +469 -0
  294. package/src/source-html-intake.mjs +627 -0
  295. package/src/source-html-manifest.mjs +276 -0
  296. package/src/source-prep.mjs +284 -0
  297. package/src/spec-derive-store.mjs +431 -0
  298. package/src/spec-derive.mjs +514 -0
  299. package/src/spec-fetch.mjs +66 -0
  300. package/src/spec-hash.mjs +48 -0
  301. package/src/spec-identity.mjs +27 -0
  302. package/src/stage-ledger.mjs +509 -0
  303. package/src/standardization-report.mjs +1297 -0
  304. package/src/template-brand-contract.mjs +473 -0
  305. package/src/template-freshness.mjs +196 -0
  306. package/src/template-reference.mjs +81 -0
  307. package/src/template-slot-manifest.mjs +150 -0
  308. package/src/text-safety.mjs +62 -0
  309. package/src/theme-gate.mjs +185 -0
  310. package/src/upsell-selector-scope.mjs +299 -0
@@ -0,0 +1,1220 @@
1
+ # Orientation contract reference
2
+
3
+ <!--
4
+ GENERATED FILE — do not edit by hand.
5
+ Source: scripts/generate-orientation-reference.mjs, from
6
+ schemas/campaigns-os-tooling-orientation.v1.schema.json
7
+ schemas/campaigns-os-release-ledger.v1.schema.json
8
+ contracts/agent-relevant-change-policy.v1.json
9
+ contracts/orientation-reason-codes.v1.json
10
+ contracts/orientation-limits.v1.json
11
+ contracts/supported-surface.json
12
+ contracts/fixtures/orientation/canonicalization/v1.json
13
+ Regenerate: node ./scripts/generate-orientation-reference.mjs --write
14
+ CI runs the same script with --check, so a stale copy of this file fails the build.
15
+ -->
16
+
17
+ This is the normative reference for `campaigns-os-tooling-orientation/v1`: every enum,
18
+ stable reason code, deterministic remedy, size bound, and terminal-outcome example a
19
+ consumer needs in order to orient on a Campaigns OS commit **without executing any
20
+ Campaigns OS code**. Start at [`AGENTS.md`](../AGENTS.md) for the reading order and the
21
+ supported-versus-internal boundary; this file is the field guide.
22
+
23
+ Schema id: `campaigns-os-tooling-orientation/v1`
24
+ Ledger schema id: `campaigns-os-release-ledger/v1`
25
+ Change policy version: `1.0.0`
26
+ Reason-code vocabulary version: `1.0.0`
27
+ Limits version: `1.0.0`
28
+ Supported surface at generation time: `1.33.0`
29
+
30
+ ## Forward compatibility
31
+
32
+ A consumer that recognizes these v1 schema IDs accepts and preserves unknown additive
33
+ properties at every object depth without interpreting them. Required fields, declared
34
+ types, and known safety-critical enums still validate exactly; an unknown schema ID or
35
+ enum value fails closed. An additive field cannot grant authority or change the meaning
36
+ of a known field. A change that does either publishes a new schema ID.
37
+
38
+ ## Terminal outcomes
39
+
40
+ Every orientation run ends on exactly one disposition. The eight below are the complete set;
41
+ an unknown value fails closed at the consumer.
42
+
43
+ | Disposition | Example envelope |
44
+ |---|---|
45
+ | `current` | [`contracts/fixtures/orientation/envelope/current.json`](../contracts/fixtures/orientation/envelope/current.json) |
46
+ | `orientation_available` | [`contracts/fixtures/orientation/envelope/orientation_available.json`](../contracts/fixtures/orientation/envelope/orientation_available.json) |
47
+ | `updated` | [`contracts/fixtures/orientation/envelope/updated.json`](../contracts/fixtures/orientation/envelope/updated.json) |
48
+ | `restart_required` | [`contracts/fixtures/orientation/envelope/restart_required.json`](../contracts/fixtures/orientation/envelope/restart_required.json) |
49
+ | `recovered_interrupted_update` | [`contracts/fixtures/orientation/envelope/recovered_interrupted_update.json`](../contracts/fixtures/orientation/envelope/recovered_interrupted_update.json) |
50
+ | `legacy_baseline` | [`contracts/fixtures/orientation/envelope/legacy_baseline.json`](../contracts/fixtures/orientation/envelope/legacy_baseline.json) |
51
+ | `freshness_unknown` | [`contracts/fixtures/orientation/envelope/freshness_unknown.json`](../contracts/fixtures/orientation/envelope/freshness_unknown.json) |
52
+ | `refused` | [`contracts/fixtures/orientation/envelope/refused.json`](../contracts/fixtures/orientation/envelope/refused.json) |
53
+
54
+ ## Ledger order and entry identity
55
+
56
+ `sequence` is the authoritative order of `contracts/release-ledger.json`: it is the entry's
57
+ position in `entries[]` (1-based) and the repository gate derives the expected value from that
58
+ position, so a consumer reading history in array order reads it in `sequence` order.
59
+ `id` is a unique, immutable label that is never reused and never renumbered, and nothing binds
60
+ its number to `sequence`; the two diverge legitimately, because when concurrent pull requests
61
+ land the later one restamps its `sequence` to follow the earlier while keeping the id it was
62
+ written with. Order by `sequence`, identify by `id`, and do not infer one from the other.
63
+
64
+ ## Release-ledger digest canonicalization
65
+
66
+ The rules below are normative. The supported self-check vector at [`contracts/fixtures/orientation/canonicalization/v1.json`](../contracts/fixtures/orientation/canonicalization/v1.json)
67
+ is generated by the same implementation that validates the ledger; CI reproduces every byte and digest before publishing this reference.
68
+ A consumer can therefore verify an independent implementation without reading anything under `scripts/**`.
69
+ Its `fixture_version` identifies the self-check vector shape; it is not a ledger or orientation payload schema ID.
70
+
71
+ ### `entry_sha256`
72
+
73
+ 1. Start from the parsed ledger-entry object and remove exactly the root property named `entry_sha256`. A missing property stays missing; no other property at any depth is excluded.
74
+ 2. Serialize objects with their own enumerable string keys sorted in ascending ECMAScript default string order (UTF-16 code-unit order). Encode each key with ECMAScript `JSON.stringify`, then `:`, then its canonical value; join members with `,` and add `{` / `}` with no whitespace.
75
+ 3. Serialize arrays in their existing order, joining canonical elements with `,` and adding `[` / `]` with no whitespace. Array order is never sorted.
76
+ 4. Serialize strings, numbers, booleans, and `null` with ECMAScript `JSON.stringify`. Canonicalization operates on the parsed ECMAScript value: `-0` becomes `0`, and integers outside the safe-integer range have already taken their parsed `Number` value. The ledger schema admits only JSON numbers, so `NaN`, positive or negative `Infinity`, and other non-JSON numeric inputs are outside the contract; if an in-memory caller nevertheless supplies one, the current canonicalizer emits `null`, matching `JSON.stringify`. A present `undefined` value likewise canonicalizes as `null`; an absent key remains absent.
77
+ 5. Compute SHA-256 over the exact UTF-8 bytes of that canonical string and encode the digest as lowercase hexadecimal.
78
+
79
+ Worked canonical byte string:
80
+
81
+ ```json
82
+ {"agent_impact":"A consumer can reproduce ledger digests independently.","changelog_section":"0.0.0+agent.9001","changelog_sha256":"32370066aa254ac6328875ea43c031773686df7f94702d8ad3e970f655776685","changes":[{"class":"documentation","path":"docs/orientation-contract-reference.md","summary":"Publish the digest rule and a self-check vector.","surface_entry":"docs/orientation-contract-reference.md"}],"compatibility":"compatible","date":"2026-09-02","id":"RL-9001","kind":"release","migration":"none","sequence":9001,"surface_version":null}
83
+ ```
84
+
85
+ Result: `55a7a77821ed4ef034683d0c5d36c897ee53e9cc2e1e42021a88e1be5bdfae54`
86
+
87
+ ### `changelog_sha256`
88
+
89
+ 1. Split `CHANGELOG.md` on LF (`\n`) into lines. A section heading is a whole line matching `^## \[([^\]]+)\] - (\d{4}-\d{2}-\d{2})\s*$`; capture group 1 is the section id and group 2 is its date.
90
+ 2. A section body starts with its heading line and ends immediately before the next matching heading, or at end-of-file when there is no next heading.
91
+ 3. Rejoin those lines with LF, then remove the single contiguous run of whitespace matching `\s+$` from the end of the whole section. Interior whitespace and line endings are otherwise bytes of the body; no newline is appended.
92
+ 4. Compute SHA-256 over the exact UTF-8 bytes of the resulting body and encode the digest as lowercase hexadecimal.
93
+
94
+ Worked source input as a JSON string (`\u0020\u0020` makes the two trailing spaces exercised by rule 3 visible):
95
+
96
+ ```json
97
+ "# Changelog\n\n## [0.0.0+agent.9001] - 2026-09-02\n\n### Added\n\n- Canonicalization example.\u0020\u0020\n\n## [1.17.0+agent.1] - 2026-09-02\n\n### Fixed\n\n- Earlier entry.\n"
98
+ ```
99
+
100
+ Worked section body after applying the boundary and trailing-whitespace rules:
101
+
102
+ ```markdown
103
+ ## [0.0.0+agent.9001] - 2026-09-02
104
+
105
+ ### Added
106
+
107
+ - Canonicalization example.
108
+ ```
109
+
110
+ Result: `32370066aa254ac6328875ea43c031773686df7f94702d8ad3e970f655776685`
111
+
112
+ ## Stable reason codes
113
+
114
+ Append-only vocabulary. Each code has one meaning, one deterministic remedy, and one owning
115
+ test id. `owner` says which repository's suite is obliged to exercise it: a `campaigns-os`
116
+ code is exercised by this repository's contract tests, a `campaigns-agent` code by the
117
+ consumer's parser tests.
118
+
119
+ | Reason code | Outcomes | Owner | Test id | Meaning | Remedy |
120
+ |---|---|---|---|---|---|
121
+ | `ahead_of_upstream` | `refused` | campaigns-agent | `TP-D4-ahead-of-upstream` | The checkout carries commits the upstream default branch does not, so its contracts are not a published generation. | Push or drop the local commits, or run against a managed generation at the published OID. |
122
+ | `already_current` | `current` | campaigns-agent | `TP-B3-already-current` | The verified target equals the active generation; nothing changed and no restart is required. | None. |
123
+ | `checkout_acquisition_failed` | `refused` | campaigns-agent | `TP-D1-acquisition-failed` | Managed acquisition did not complete: interrupted clone, remote validation failure, or a broken linked-worktree backpointer. Partial state is quarantined, never exposed as ready. | Rerun acquisition. If it fails repeatedly, inspect the quarantined partial named in the diagnostic and confirm remote reachability. |
124
+ | `checkout_already_exists` | `refused` | campaigns-agent | `TP-D1-checkout-already-exists` | The managed root reserved for acquisition appeared concurrently and is not an empty reservation this run owns. | Rerun so the existing root is validated as a managed store, or remove the unexpected directory after confirming it holds no needed state. |
125
+ | `checkout_missing` | `refused` | campaigns-agent | `TP-D1-checkout-missing` | No checkout exists at the configured location and the mode does not authorize acquiring one. | Supply the operator checkout at the configured path, or switch to managed mode so a generation can be acquired. |
126
+ | `checkout_mutation_not_authorized` | `refused` | campaigns-agent | `TP-D4-mutation-not-authorized` | The requested action would write to an operator-supplied checkout, which is always inspect-only. | Switch to managed mode, or perform the change yourself in the operator checkout. No flag grants this authority. |
127
+ | `detached_head` | `refused` | campaigns-agent | `TP-D4-detached-head` | The checkout's HEAD is detached, so there is no branch to compare against the expected branch. | Check out the expected branch, or declare the checkout managed so orientation supplies its own generation. |
128
+ | `dirty_checkout` | `refused` | campaigns-agent | `TP-D4-dirty-checkout` | The operator-supplied checkout has uncommitted worktree or index changes, so its bytes are not the bytes of any commit. | Commit or stash the local changes, or run against a managed generation. Orientation never writes to an operator checkout to clean it. |
129
+ | `diverged_history` | `refused` | campaigns-agent | `TP-D3-diverged-history` | The checkout and the upstream default branch have diverged; neither is an ancestor of the other. | Reconcile the branch with upstream by hand. Orientation refuses rather than choosing a side. |
130
+ | `evidence_budget_exceeded` | `refused` | campaigns-agent | `TP-F-evidence-budget-exceeded` | Bounded operator-state evidence storage would be exceeded by this run's records. | Let retention prune, or raise the evidence budget as a reviewed policy change. Orientation refuses rather than launching a session it cannot audit. |
131
+ | `fetch_failed` | `freshness_unknown`, `refused` | campaigns-agent | `TP-D2-fetch-failed` | The bounded freshness fetch did not complete: offline, DNS failure, timeout, or authentication failure. | Restore network access and rerun. The prior verified generation is left intact and no launch proceeds under strict-latest policy. |
132
+ | `git_environment_unsafe` | `refused` | campaigns-agent | `TP-D2-hostile-git-config` | Ambient Git configuration could change command behavior: hooks, aliases, pagers, credential prompts, external diff or merge helpers, or filesystem monitors. | Rerun through the supported launcher, which runs Git under an explicit environment and config allowlist. Do not disable the allowlist. |
133
+ | `history_incomplete` | `refused` | campaigns-agent | `TP-B2-shallow-history` | The reviewed baseline commit or an entry's introducing commit is not reachable in the available history, typically a shallow clone. | Deepen the clone to include the reviewed baseline, or adopt a newer reviewed baseline that is present. |
134
+ | `missing_upstream` | `refused` | campaigns-agent | `TP-D4-missing-upstream` | The checkout's current branch has no upstream tracking ref, so ahead/behind cannot be computed. | Set the branch upstream to the expected remote branch, or use managed mode. |
135
+ | `orientation_contract_missing` | `refused` | campaigns-agent | `TP-G-orientation-contract-missing` | The target commit predates campaigns-os-tooling-orientation/v1 and carries no orientation contract, and it is not the one reviewed legacy baseline. | Target a commit that ships the orientation contract, or declare the exact reviewed legacy baseline for the one-time attended migration path. |
136
+ | `orientation_in_progress` | `refused` | campaigns-agent | `TP-D3-orientation-in-progress` | Another process holds the orientation lock for this target. | Wait for the holder named in the diagnostic to finish, or clear a stale lock after confirming its owner process is gone. |
137
+ | `orientation_incomplete` | `refused` | campaigns-os | `A1-orientation-incomplete` | The target commit declares an agent-relevant change that no release-ledger entry covers, or a ledger entry that maps to no classified change and no reviewed amendment. The two-way release gate is not satisfied at that commit. | At the target commit, add the missing ledger change item, or add a reviewed amendment entry. The refusal names the uncovered path or the orphaned change identity. Never weaken the classifier to pass. |
138
+ | `orientation_rendered` | `orientation_available`, `updated`, `restart_required`, `legacy_baseline` | campaigns-agent | `TP-B3-orientation-rendered` | A complete orientation envelope was assembled and rendered without mutating anything. | None. Read the envelope's release_ledger and changelog groups to see what changed since the reviewed baseline. |
139
+ | `orientation_too_large` | `refused` | campaigns-os | `A1-orientation-too-large` | A declared limit in contracts/orientation-limits.v1.json was exceeded: source bytes, section count, section bytes, envelope bytes, or ledger entries. | Adopt a newer reviewed baseline so the window is smaller, or raise the limit as a reviewed policy change that advances limits_version and carries its own ledger entry. Orientation refuses; it never truncates. |
140
+ | `pointer_race` | `refused` | campaigns-agent | `TP-E2-pointer-race` | The active generation pointer changed between read and compare-and-swap. | Rerun. The transaction is safe to retry; the prior generation stays active until a swap succeeds. |
141
+ | `runtime_commit_mismatch` | `refused` | campaigns-agent | `TP-E2-runtime-commit-mismatch` | Source, skills, and command-line bytes in the candidate generation do not all resolve to one commit. | Discard the candidate generation and prepare a fresh one. A session is never bound to a mixed-commit generation. |
142
+ | `runtime_refresh_failed` | `refused` | campaigns-agent | `TP-E1-runtime-refresh-failed` | The declared preparation recipe ran and did not produce a verifiable generated runtime. | Read the recorded recipe output in the run evidence. The prior verified generation remains active and usable. |
143
+ | `runtime_refresh_required` | `restart_required`, `refused` | campaigns-agent | `TP-E1-runtime-refresh-required` | The generated runtime is absent or does not match its source fingerprint at the target commit. | Let the launcher prepare a fresh generation, which runs the declared preparation recipe in isolation. Never rebuild in place over an active generation. |
144
+ | `surface_incompatible` | `refused` | campaigns-agent | `TP-G-surface-incompatible` | The target supported-surface version falls outside the consumer's accepted supported_surface_range. | Upgrade the consumer to a build whose accepted range covers the target, or pin a reviewed baseline inside the current range. |
145
+ | `transaction_incomplete` | `refused` | campaigns-agent | `TP-E3-transaction-incomplete` | A prior promotion transaction was interrupted and its record cannot be reconciled to a safe terminal state. | Inspect the promotion record named in the diagnostic. The prior verified generation stays active; no partial generation is promoted. |
146
+ | `transaction_reconciled` | `recovered_interrupted_update` | campaigns-agent | `TP-E3-transaction-reconciled` | An interrupted promotion transaction was found and completed or rolled back deterministically on this run. | None. This is an informational terminal state; the reconciliation outcome is recorded in run evidence. |
147
+ | `wrong_remote` | `refused` | campaigns-agent | `TP-D2-wrong-remote` | The observed checkout's origin remote does not normalize to the expected owner/repository identity. | Point the checkout at the expected remote, or supply a checkout whose origin matches the manifest's remote_identity. The refusal names the expected identity. |
148
+
149
+ ## Size bounds
150
+
151
+ Declared in [`contracts/orientation-limits.v1.json`](../contracts/orientation-limits.v1.json). Exceeding any bound is a refusal with
152
+ reason code `orientation_too_large`. Orientation **never truncates** — a partial view of a
153
+ release is worse than a refusal, because the consumer cannot tell which part it is missing.
154
+
155
+ | Limit | Value | Unit | Applies to | Rationale |
156
+ |---|---|---|---|---|
157
+ | `max_source_bytes` | 1048576 | bytes | The total bytes of orientation source read from Git objects at the target OID: the whole release ledger, the whole changelog, the supported-surface manifest, the orientation contract data files, and both orientation schemas — every mandatory read in the canonical sequence in AGENTS.md. | 1 MiB. Measured at surface 1.14.0 the whole set is about 88 KB, so this is roughly 12x current headroom while still bounding a single read to something a consumer can hold in memory and hash without streaming. |
158
+ | `max_section_count` | 1024 | sections | The number of sections in CHANGELOG.md at the target commit. | 9 sections existed at surface 1.14.0 across roughly one month of releases. Because this bounds the whole file rather than a window, it has to survive years: 1024 is on the order of a decade at that cadence, and reaching it is the signal to rotate the baseline rather than to raise the number again. |
159
+ | `max_section_bytes` | 65536 | bytes | The bytes of any single changelog section body. | 64 KiB. The largest section at surface 1.14.0 was 3.9 KB, so this is about 16x headroom. Unlike the counts this one does not accumulate — a single section larger than this is a drafting error, not a release worth orienting on in one read. |
160
+ | `max_envelope_bytes` | 262144 | bytes | The serialized orientation envelope handed to the consumer. The real envelope is assembled by the consumer and never exists in this repository, so the repository-side check measures the largest assembled example it ships, contracts/fixtures/orientation/envelope/*.json. | 256 KiB. Roughly 64k tokens worst case, which keeps a full orientation read inside a model context budget with room for the session's own work. Deliberately smaller than max_source_bytes: the envelope is a selection of source, not a copy of it. The largest shipped example at surface 1.14.0 is about 4.5 KB. |
161
+ | `max_ledger_entries` | 1024 | entries | The number of entries in contracts/release-ledger.json at the target commit. | The ledger holds 1 entry at limits_version 1.0.0 and is append-only, so like max_section_count this accumulates for the life of the repository. 1024 is on the order of a decade at the observed release cadence; reaching it means rotating the baseline as described in _growth_note. |
162
+
163
+ ## Semantic change classes
164
+
165
+ Defined once in [`contracts/agent-relevant-change-policy.v1.json`](../contracts/agent-relevant-change-policy.v1.json). Every agent-relevant change is recorded
166
+ under exactly one of these, and the classifier fails closed on a path that matches nothing.
167
+
168
+ | Class | Description |
169
+ |---|---|
170
+ | `schema` | A JSON Schema in schemas/ that a consumer validates artifacts against. |
171
+ | `hashed_surface` | A path recorded in contracts/supported-surface.json hashed{}; its bytes are pinned and a change owes a surface_version advance. |
172
+ | `named_surface` | A path recorded in contracts/supported-surface.json named[]; content may evolve but the path must keep existing. |
173
+ | `cli_surface` | A CLI command, subcommand, or flag reachable from the supported argv surface. |
174
+ | `skill` | A versioned skill package or its installer. |
175
+ | `package_export` | package.json exports, bin, files, engines, or the dependency/script set a consumer installs. |
176
+ | `compatibility_policy` | The published compatibility statement, the supported-surface manifest, or the documents that define surface discipline. |
177
+ | `documentation` | Agent-facing documentation of record: the agent entry point, contract references, and authoring guides. |
178
+ | `workflow` | A repository workflow or workflow contract that produces or gates a supported artifact. |
179
+ | `generated_runtime` | Sources or lockfiles for the generated runtime a consumer must prepare before use. |
180
+
181
+ Classifier evaluation order:
182
+
183
+ > Evaluation order is fixed and total: self_referential_exemptions -> rules -> derived_from_supported_surface -> ignored -> unclassified (an error). First match wins within each ordered list. match.kind is one of exact | prefix. A rule may carry match_suffix (the path must also end with it) and exclude[] (matches that make the rule NOT apply, so a narrower path falls through to a later rule or to ignored). The derived pass runs BEFORE ignored so that a path newly added to the supported surface can never be swallowed by a broad ignore prefix; that is the fail-closed direction.
184
+
185
+ ## Schema enum inventory
186
+
187
+ Every enumerated value in both schemas, listed exactly once. A value that appears here and
188
+ nowhere in the schemas, or in the schemas and not here, is a generation failure.
189
+
190
+ ### `schemas/campaigns-os-tooling-orientation.v1.schema.json`
191
+
192
+ | Location | Values |
193
+ |---|---|
194
+ | `properties.request.properties.checkout_mode` | `managed`, `operator_supplied` |
195
+ | `properties.request.properties.mutation_policy` | `observe_only`, `managed_update` |
196
+ | `properties.repository.properties.graph_relation` | `identical`, `behind`, `ahead`, `diverged`, `unknown` |
197
+ | `properties.freshness.properties.state` | `current`, `available`, `updated`, `unknown`, `refused` |
198
+ | `properties.surface.properties.compatibility_result` | `compatible`, `incompatible`, `unknown` |
199
+ | `properties.release_ledger.properties.entries.items.properties.kind` | `release`, `amendment` |
200
+ | `properties.release_ledger.properties.entries.items.properties.compatibility` | `compatible`, `additive`, `breaking` |
201
+ | `properties.runtime.properties.generated_state` | `absent`, `stale`, `fresh`, `corrupt`, `unknown` |
202
+ | `properties.runtime.properties.refresh_action` | `none`, `prepare_new_generation`, `refused` |
203
+ | `properties.transaction.properties.state` | `none`, `requested`, `intent_recorded`, `finalized`, `reconciled`, `failed` |
204
+ | `properties.limits.properties.exceeded.items` | `max_source_bytes`, `max_section_count`, `max_section_bytes`, `max_envelope_bytes`, `max_ledger_entries` |
205
+ | `$defs.baseline.properties.kind` | `legacy_commit`, `supported_surface` |
206
+ | `$defs.change_class` | `schema`, `hashed_surface`, `named_surface`, `cli_surface`, `skill`, `package_export`, `compatibility_policy`, `documentation`, `workflow`, `generated_runtime` |
207
+ | `$defs.disposition` | `current`, `orientation_available`, `updated`, `restart_required`, `recovered_interrupted_update`, `legacy_baseline`, `freshness_unknown`, `refused` |
208
+ | `$defs.reason_code` | `already_current`, `ahead_of_upstream`, `checkout_acquisition_failed`, `checkout_already_exists`, `checkout_missing`, `checkout_mutation_not_authorized`, `detached_head`, `dirty_checkout`, `diverged_history`, `evidence_budget_exceeded`, `fetch_failed`, `git_environment_unsafe`, `history_incomplete`, `missing_upstream`, `orientation_contract_missing`, `orientation_in_progress`, `orientation_incomplete`, `orientation_rendered`, `orientation_too_large`, `pointer_race`, `runtime_commit_mismatch`, `runtime_refresh_failed`, `runtime_refresh_required`, `surface_incompatible`, `transaction_incomplete`, `transaction_reconciled`, `wrong_remote` |
209
+
210
+ ### `schemas/campaigns-os-release-ledger.v1.schema.json`
211
+
212
+ | Location | Values |
213
+ |---|---|
214
+ | `$defs.entry.properties.kind` | `release`, `amendment` |
215
+ | `$defs.entry.properties.compatibility` | `compatible`, `additive`, `breaking` |
216
+ | `$defs.change.properties.class` | `schema`, `hashed_surface`, `named_surface`, `cli_surface`, `skill`, `package_export`, `compatibility_policy`, `documentation`, `workflow`, `generated_runtime` |
217
+
218
+ ## Supported CLI commands
219
+
220
+ The argv surface declared in [`contracts/supported-surface.json`](../contracts/supported-surface.json). Every command listed here
221
+ resolves in the CLI dispatch; the contract test asserts that against the real dispatch table,
222
+ so a renamed command fails here as well as at the supported-surface gate.
223
+
224
+ - `campaigns-os start`
225
+ - `campaigns-os prepare-build`
226
+ - `campaigns-os build`
227
+ - `campaigns-os polish`
228
+ - `campaigns-os checkpoint`
229
+ - `campaigns-os page-kit`
230
+ - `campaigns-os spec`
231
+ - `campaigns-os doctor`
232
+ - `campaigns-os bundle`
233
+ - `campaigns-os next`
234
+ - `campaigns-os theme`
235
+ - `campaigns-os tooling`
236
+ - `campaigns-os install-skills`
237
+ - `campaigns-os install-agent-context`
238
+ - `campaigns-os validate-assembly-report`
239
+ - `campaigns-os telemetry`
240
+ - `campaigns-os standardize`
241
+ - `campaigns-os qa`
242
+ - `campaigns-os findings`
243
+ - `campaigns-os run-record`
244
+ - `campaigns-os run`
245
+
246
+ ## Terminal outcome examples
247
+
248
+ Generated from the same fixtures the contract tests validate, so an example can never drift
249
+ from the schema it claims to satisfy.
250
+
251
+ ### `current`
252
+
253
+ ```json
254
+ {
255
+ "schema_version": "campaigns-os-tooling-orientation/v1",
256
+ "request": {
257
+ "run_id": "run-example-0001",
258
+ "checkout_mode": "managed",
259
+ "mutation_policy": "observe_only",
260
+ "baseline": {
261
+ "kind": "supported_surface",
262
+ "commit": "1111111111111111111111111111111111111111",
263
+ "surface_version": "1.13.0"
264
+ },
265
+ "accepted_orientation_schemas": [
266
+ "campaigns-os-tooling-orientation/v1"
267
+ ],
268
+ "accepted_surface_range": ">=1.13.0 <2.0.0",
269
+ "manifest_sha256": "3333333333333333333333333333333333333333333333333333333333333333"
270
+ },
271
+ "repository": {
272
+ "owner": "NextCommerceCo",
273
+ "repository": "campaigns-os",
274
+ "branch": "main",
275
+ "upstream": "origin/main",
276
+ "clean": true,
277
+ "shallow": false,
278
+ "graph_relation": "identical",
279
+ "common_git_identity": "managed-store-0001",
280
+ "worktree_identity": "generation-0001",
281
+ "commit_before": "1111111111111111111111111111111111111111",
282
+ "commit_fetched": "1111111111111111111111111111111111111111",
283
+ "commit_after": "1111111111111111111111111111111111111111"
284
+ },
285
+ "freshness": {
286
+ "state": "current",
287
+ "observed_at": "2026-08-28T00:00:00Z",
288
+ "fetch_result": {
289
+ "attempted": true,
290
+ "succeeded": true,
291
+ "duration_ms": 420
292
+ }
293
+ },
294
+ "surface": {
295
+ "reviewed_version": "1.13.0",
296
+ "target_version": "1.13.0",
297
+ "current_version": "1.13.0",
298
+ "compatibility_result": "compatible",
299
+ "compatibility_rule": "target surface_version is inside the consumer's accepted_surface_range",
300
+ "transitions": []
301
+ },
302
+ "release_ledger": {
303
+ "ledger_schema_version": "campaigns-os-release-ledger/v1",
304
+ "entries": []
305
+ },
306
+ "changelog": {
307
+ "sections": []
308
+ },
309
+ "runtime": {
310
+ "recipe_id": null,
311
+ "source_fingerprint": "3333333333333333333333333333333333333333333333333333333333333333",
312
+ "generated_state": "fresh",
313
+ "emitter_commit": "1111111111111111111111111111111111111111",
314
+ "refresh_action": "none",
315
+ "ready": true
316
+ },
317
+ "transaction": {
318
+ "state": "none",
319
+ "commit_before": "1111111111111111111111111111111111111111",
320
+ "commit_target": "1111111111111111111111111111111111111111",
321
+ "commit_observed": "1111111111111111111111111111111111111111",
322
+ "recovered_interrupted_update": false
323
+ },
324
+ "outcome": {
325
+ "disposition": "current",
326
+ "reason_code": "already_current",
327
+ "active_generation_changed": false,
328
+ "fresh_exec_required": false,
329
+ "next_actions": [
330
+ "proceed"
331
+ ]
332
+ },
333
+ "limits": {
334
+ "limits_version": "1.0.0",
335
+ "max_source_bytes": 1048576,
336
+ "max_section_count": 1024,
337
+ "max_section_bytes": 65536,
338
+ "max_envelope_bytes": 262144,
339
+ "max_ledger_entries": 1024,
340
+ "applied": {
341
+ "source_bytes": 22024,
342
+ "section_count": 8,
343
+ "max_observed_section_bytes": 3903,
344
+ "envelope_bytes": 4096,
345
+ "ledger_entries": 1
346
+ }
347
+ }
348
+ }
349
+ ```
350
+
351
+ ### `orientation_available`
352
+
353
+ ```json
354
+ {
355
+ "schema_version": "campaigns-os-tooling-orientation/v1",
356
+ "request": {
357
+ "run_id": "run-example-0001",
358
+ "checkout_mode": "managed",
359
+ "mutation_policy": "observe_only",
360
+ "baseline": {
361
+ "kind": "supported_surface",
362
+ "commit": "1111111111111111111111111111111111111111",
363
+ "surface_version": "1.13.0"
364
+ },
365
+ "accepted_orientation_schemas": [
366
+ "campaigns-os-tooling-orientation/v1"
367
+ ],
368
+ "accepted_surface_range": ">=1.13.0 <2.0.0",
369
+ "manifest_sha256": "3333333333333333333333333333333333333333333333333333333333333333"
370
+ },
371
+ "repository": {
372
+ "owner": "NextCommerceCo",
373
+ "repository": "campaigns-os",
374
+ "branch": "main",
375
+ "upstream": "origin/main",
376
+ "clean": true,
377
+ "shallow": false,
378
+ "graph_relation": "identical",
379
+ "common_git_identity": "managed-store-0001",
380
+ "worktree_identity": "generation-0001",
381
+ "commit_before": "1111111111111111111111111111111111111111",
382
+ "commit_fetched": "1111111111111111111111111111111111111111",
383
+ "commit_after": "1111111111111111111111111111111111111111"
384
+ },
385
+ "freshness": {
386
+ "state": "available",
387
+ "observed_at": "2026-08-28T00:00:00Z",
388
+ "fetch_result": {
389
+ "attempted": true,
390
+ "succeeded": true,
391
+ "duration_ms": 610
392
+ }
393
+ },
394
+ "surface": {
395
+ "reviewed_version": "1.13.0",
396
+ "target_version": "1.14.0",
397
+ "current_version": "1.13.0",
398
+ "compatibility_result": "compatible",
399
+ "compatibility_rule": "target surface_version is inside the consumer's accepted_surface_range",
400
+ "transitions": [
401
+ {
402
+ "from": "1.13.0",
403
+ "to": "1.14.0"
404
+ }
405
+ ]
406
+ },
407
+ "release_ledger": {
408
+ "ledger_schema_version": "campaigns-os-release-ledger/v1",
409
+ "entries": [
410
+ {
411
+ "id": "RL-0001",
412
+ "sequence": 1,
413
+ "date": "2026-08-28",
414
+ "kind": "release",
415
+ "surface_version": "1.14.0",
416
+ "changelog_section": "1.14.0",
417
+ "changelog_sha256": "3333333333333333333333333333333333333333333333333333333333333333",
418
+ "agent_impact": "A consumer may now read the orientation contract and release ledger from Git objects.",
419
+ "compatibility": "additive",
420
+ "migration": "none",
421
+ "affected_surface_entries": [
422
+ "contracts/release-ledger.json"
423
+ ],
424
+ "changes": [
425
+ {
426
+ "class": "named_surface",
427
+ "path": "contracts/release-ledger.json",
428
+ "surface_entry": "contracts/release-ledger.json",
429
+ "summary": "The append-only agent-relevant release ledger was introduced."
430
+ }
431
+ ],
432
+ "entry_sha256": "3333333333333333333333333333333333333333333333333333333333333333",
433
+ "introducing_commit": "2222222222222222222222222222222222222222"
434
+ }
435
+ ]
436
+ },
437
+ "changelog": {
438
+ "sections": [
439
+ {
440
+ "section_id": "1.14.0",
441
+ "date": "2026-08-28",
442
+ "agent_impact": "A consumer may now read the orientation contract and release ledger from Git objects.",
443
+ "migration_action": "none",
444
+ "body_markdown": "## [1.14.0] - 2026-08-28\n\n### Added\n\n- The orientation contract and the agent-relevant release ledger.",
445
+ "body_sha256": "3333333333333333333333333333333333333333333333333333333333333333"
446
+ }
447
+ ]
448
+ },
449
+ "runtime": {
450
+ "recipe_id": null,
451
+ "source_fingerprint": "3333333333333333333333333333333333333333333333333333333333333333",
452
+ "generated_state": "fresh",
453
+ "emitter_commit": "1111111111111111111111111111111111111111",
454
+ "refresh_action": "none",
455
+ "ready": true
456
+ },
457
+ "transaction": {
458
+ "state": "none",
459
+ "commit_before": "1111111111111111111111111111111111111111",
460
+ "commit_target": "1111111111111111111111111111111111111111",
461
+ "commit_observed": "1111111111111111111111111111111111111111",
462
+ "recovered_interrupted_update": false
463
+ },
464
+ "outcome": {
465
+ "disposition": "orientation_available",
466
+ "reason_code": "orientation_rendered",
467
+ "active_generation_changed": false,
468
+ "fresh_exec_required": false,
469
+ "next_actions": [
470
+ "review the release ledger",
471
+ "request a managed update"
472
+ ]
473
+ },
474
+ "limits": {
475
+ "limits_version": "1.0.0",
476
+ "max_source_bytes": 1048576,
477
+ "max_section_count": 1024,
478
+ "max_section_bytes": 65536,
479
+ "max_envelope_bytes": 262144,
480
+ "max_ledger_entries": 1024,
481
+ "applied": {
482
+ "source_bytes": 22024,
483
+ "section_count": 8,
484
+ "max_observed_section_bytes": 3903,
485
+ "envelope_bytes": 4096,
486
+ "ledger_entries": 1
487
+ }
488
+ }
489
+ }
490
+ ```
491
+
492
+ ### `updated`
493
+
494
+ ```json
495
+ {
496
+ "schema_version": "campaigns-os-tooling-orientation/v1",
497
+ "request": {
498
+ "run_id": "run-example-0001",
499
+ "checkout_mode": "managed",
500
+ "mutation_policy": "managed_update",
501
+ "baseline": {
502
+ "kind": "supported_surface",
503
+ "commit": "1111111111111111111111111111111111111111",
504
+ "surface_version": "1.13.0"
505
+ },
506
+ "accepted_orientation_schemas": [
507
+ "campaigns-os-tooling-orientation/v1"
508
+ ],
509
+ "accepted_surface_range": ">=1.13.0 <2.0.0",
510
+ "manifest_sha256": "3333333333333333333333333333333333333333333333333333333333333333"
511
+ },
512
+ "repository": {
513
+ "owner": "NextCommerceCo",
514
+ "repository": "campaigns-os",
515
+ "branch": "main",
516
+ "upstream": "origin/main",
517
+ "clean": true,
518
+ "shallow": false,
519
+ "graph_relation": "identical",
520
+ "common_git_identity": "managed-store-0001",
521
+ "worktree_identity": "generation-0001",
522
+ "commit_before": "1111111111111111111111111111111111111111",
523
+ "commit_fetched": "2222222222222222222222222222222222222222",
524
+ "commit_after": "2222222222222222222222222222222222222222"
525
+ },
526
+ "freshness": {
527
+ "state": "updated",
528
+ "observed_at": "2026-08-28T00:00:00Z",
529
+ "fetch_result": {
530
+ "attempted": true,
531
+ "succeeded": true,
532
+ "duration_ms": 610
533
+ }
534
+ },
535
+ "surface": {
536
+ "reviewed_version": "1.13.0",
537
+ "target_version": "1.14.0",
538
+ "current_version": "1.13.0",
539
+ "compatibility_result": "compatible",
540
+ "compatibility_rule": "target surface_version is inside the consumer's accepted_surface_range",
541
+ "transitions": [
542
+ {
543
+ "from": "1.13.0",
544
+ "to": "1.14.0"
545
+ }
546
+ ]
547
+ },
548
+ "release_ledger": {
549
+ "ledger_schema_version": "campaigns-os-release-ledger/v1",
550
+ "entries": [
551
+ {
552
+ "id": "RL-0001",
553
+ "sequence": 1,
554
+ "date": "2026-08-28",
555
+ "kind": "release",
556
+ "surface_version": "1.14.0",
557
+ "changelog_section": "1.14.0",
558
+ "changelog_sha256": "3333333333333333333333333333333333333333333333333333333333333333",
559
+ "agent_impact": "A consumer may now read the orientation contract and release ledger from Git objects.",
560
+ "compatibility": "additive",
561
+ "migration": "none",
562
+ "affected_surface_entries": [
563
+ "contracts/release-ledger.json"
564
+ ],
565
+ "changes": [
566
+ {
567
+ "class": "named_surface",
568
+ "path": "contracts/release-ledger.json",
569
+ "surface_entry": "contracts/release-ledger.json",
570
+ "summary": "The append-only agent-relevant release ledger was introduced."
571
+ }
572
+ ],
573
+ "entry_sha256": "3333333333333333333333333333333333333333333333333333333333333333",
574
+ "introducing_commit": "2222222222222222222222222222222222222222"
575
+ }
576
+ ]
577
+ },
578
+ "changelog": {
579
+ "sections": [
580
+ {
581
+ "section_id": "1.14.0",
582
+ "date": "2026-08-28",
583
+ "agent_impact": "A consumer may now read the orientation contract and release ledger from Git objects.",
584
+ "migration_action": "none",
585
+ "body_markdown": "## [1.14.0] - 2026-08-28\n\n### Added\n\n- The orientation contract and the agent-relevant release ledger.",
586
+ "body_sha256": "3333333333333333333333333333333333333333333333333333333333333333"
587
+ }
588
+ ]
589
+ },
590
+ "runtime": {
591
+ "recipe_id": null,
592
+ "source_fingerprint": "3333333333333333333333333333333333333333333333333333333333333333",
593
+ "generated_state": "fresh",
594
+ "emitter_commit": "1111111111111111111111111111111111111111",
595
+ "refresh_action": "none",
596
+ "ready": true
597
+ },
598
+ "transaction": {
599
+ "state": "finalized",
600
+ "commit_before": "1111111111111111111111111111111111111111",
601
+ "commit_target": "2222222222222222222222222222222222222222",
602
+ "commit_observed": "2222222222222222222222222222222222222222",
603
+ "recovered_interrupted_update": false
604
+ },
605
+ "outcome": {
606
+ "disposition": "updated",
607
+ "reason_code": "orientation_rendered",
608
+ "active_generation_changed": true,
609
+ "fresh_exec_required": true,
610
+ "next_actions": [
611
+ "start a fresh session against the promoted generation"
612
+ ]
613
+ },
614
+ "limits": {
615
+ "limits_version": "1.0.0",
616
+ "max_source_bytes": 1048576,
617
+ "max_section_count": 1024,
618
+ "max_section_bytes": 65536,
619
+ "max_envelope_bytes": 262144,
620
+ "max_ledger_entries": 1024,
621
+ "applied": {
622
+ "source_bytes": 22024,
623
+ "section_count": 8,
624
+ "max_observed_section_bytes": 3903,
625
+ "envelope_bytes": 4096,
626
+ "ledger_entries": 1
627
+ }
628
+ }
629
+ }
630
+ ```
631
+
632
+ ### `restart_required`
633
+
634
+ ```json
635
+ {
636
+ "schema_version": "campaigns-os-tooling-orientation/v1",
637
+ "request": {
638
+ "run_id": "run-example-0001",
639
+ "checkout_mode": "managed",
640
+ "mutation_policy": "observe_only",
641
+ "baseline": {
642
+ "kind": "supported_surface",
643
+ "commit": "1111111111111111111111111111111111111111",
644
+ "surface_version": "1.13.0"
645
+ },
646
+ "accepted_orientation_schemas": [
647
+ "campaigns-os-tooling-orientation/v1"
648
+ ],
649
+ "accepted_surface_range": ">=1.13.0 <2.0.0",
650
+ "manifest_sha256": "3333333333333333333333333333333333333333333333333333333333333333"
651
+ },
652
+ "repository": {
653
+ "owner": "NextCommerceCo",
654
+ "repository": "campaigns-os",
655
+ "branch": "main",
656
+ "upstream": "origin/main",
657
+ "clean": true,
658
+ "shallow": false,
659
+ "graph_relation": "identical",
660
+ "common_git_identity": "managed-store-0001",
661
+ "worktree_identity": "generation-0001",
662
+ "commit_before": "1111111111111111111111111111111111111111",
663
+ "commit_fetched": "1111111111111111111111111111111111111111",
664
+ "commit_after": "1111111111111111111111111111111111111111"
665
+ },
666
+ "freshness": {
667
+ "state": "available",
668
+ "observed_at": "2026-08-28T00:00:00Z",
669
+ "fetch_result": {
670
+ "attempted": true,
671
+ "succeeded": true,
672
+ "duration_ms": 610
673
+ }
674
+ },
675
+ "surface": {
676
+ "reviewed_version": "1.13.0",
677
+ "target_version": "1.14.0",
678
+ "current_version": "1.13.0",
679
+ "compatibility_result": "compatible",
680
+ "compatibility_rule": "target surface_version is inside the consumer's accepted_surface_range",
681
+ "transitions": [
682
+ {
683
+ "from": "1.13.0",
684
+ "to": "1.14.0"
685
+ }
686
+ ]
687
+ },
688
+ "release_ledger": {
689
+ "ledger_schema_version": "campaigns-os-release-ledger/v1",
690
+ "entries": [
691
+ {
692
+ "id": "RL-0001",
693
+ "sequence": 1,
694
+ "date": "2026-08-28",
695
+ "kind": "release",
696
+ "surface_version": "1.14.0",
697
+ "changelog_section": "1.14.0",
698
+ "changelog_sha256": "3333333333333333333333333333333333333333333333333333333333333333",
699
+ "agent_impact": "A consumer may now read the orientation contract and release ledger from Git objects.",
700
+ "compatibility": "additive",
701
+ "migration": "none",
702
+ "affected_surface_entries": [
703
+ "contracts/release-ledger.json"
704
+ ],
705
+ "changes": [
706
+ {
707
+ "class": "named_surface",
708
+ "path": "contracts/release-ledger.json",
709
+ "surface_entry": "contracts/release-ledger.json",
710
+ "summary": "The append-only agent-relevant release ledger was introduced."
711
+ }
712
+ ],
713
+ "entry_sha256": "3333333333333333333333333333333333333333333333333333333333333333",
714
+ "introducing_commit": "2222222222222222222222222222222222222222"
715
+ }
716
+ ]
717
+ },
718
+ "changelog": {
719
+ "sections": [
720
+ {
721
+ "section_id": "1.14.0",
722
+ "date": "2026-08-28",
723
+ "agent_impact": "A consumer may now read the orientation contract and release ledger from Git objects.",
724
+ "migration_action": "none",
725
+ "body_markdown": "## [1.14.0] - 2026-08-28\n\n### Added\n\n- The orientation contract and the agent-relevant release ledger.",
726
+ "body_sha256": "3333333333333333333333333333333333333333333333333333333333333333"
727
+ }
728
+ ]
729
+ },
730
+ "runtime": {
731
+ "recipe_id": null,
732
+ "source_fingerprint": "3333333333333333333333333333333333333333333333333333333333333333",
733
+ "generated_state": "stale",
734
+ "emitter_commit": "1111111111111111111111111111111111111111",
735
+ "refresh_action": "prepare_new_generation",
736
+ "ready": false,
737
+ "reason_code": "runtime_refresh_required"
738
+ },
739
+ "transaction": {
740
+ "state": "none",
741
+ "commit_before": "1111111111111111111111111111111111111111",
742
+ "commit_target": "1111111111111111111111111111111111111111",
743
+ "commit_observed": "1111111111111111111111111111111111111111",
744
+ "recovered_interrupted_update": false
745
+ },
746
+ "outcome": {
747
+ "disposition": "restart_required",
748
+ "reason_code": "runtime_refresh_required",
749
+ "active_generation_changed": false,
750
+ "fresh_exec_required": true,
751
+ "next_actions": [
752
+ "prepare a new generation",
753
+ "start a fresh session"
754
+ ]
755
+ },
756
+ "limits": {
757
+ "limits_version": "1.0.0",
758
+ "max_source_bytes": 1048576,
759
+ "max_section_count": 1024,
760
+ "max_section_bytes": 65536,
761
+ "max_envelope_bytes": 262144,
762
+ "max_ledger_entries": 1024,
763
+ "applied": {
764
+ "source_bytes": 22024,
765
+ "section_count": 8,
766
+ "max_observed_section_bytes": 3903,
767
+ "envelope_bytes": 4096,
768
+ "ledger_entries": 1
769
+ }
770
+ }
771
+ }
772
+ ```
773
+
774
+ ### `recovered_interrupted_update`
775
+
776
+ ```json
777
+ {
778
+ "schema_version": "campaigns-os-tooling-orientation/v1",
779
+ "request": {
780
+ "run_id": "run-example-0001",
781
+ "checkout_mode": "managed",
782
+ "mutation_policy": "managed_update",
783
+ "baseline": {
784
+ "kind": "supported_surface",
785
+ "commit": "1111111111111111111111111111111111111111",
786
+ "surface_version": "1.13.0"
787
+ },
788
+ "accepted_orientation_schemas": [
789
+ "campaigns-os-tooling-orientation/v1"
790
+ ],
791
+ "accepted_surface_range": ">=1.13.0 <2.0.0",
792
+ "manifest_sha256": "3333333333333333333333333333333333333333333333333333333333333333"
793
+ },
794
+ "repository": {
795
+ "owner": "NextCommerceCo",
796
+ "repository": "campaigns-os",
797
+ "branch": "main",
798
+ "upstream": "origin/main",
799
+ "clean": true,
800
+ "shallow": false,
801
+ "graph_relation": "identical",
802
+ "common_git_identity": "managed-store-0001",
803
+ "worktree_identity": "generation-0001",
804
+ "commit_before": "1111111111111111111111111111111111111111",
805
+ "commit_fetched": "2222222222222222222222222222222222222222",
806
+ "commit_after": "2222222222222222222222222222222222222222"
807
+ },
808
+ "freshness": {
809
+ "state": "updated",
810
+ "observed_at": "2026-08-28T00:00:00Z",
811
+ "fetch_result": {
812
+ "attempted": true,
813
+ "succeeded": true,
814
+ "duration_ms": 610
815
+ }
816
+ },
817
+ "surface": {
818
+ "reviewed_version": "1.13.0",
819
+ "target_version": "1.14.0",
820
+ "current_version": "1.13.0",
821
+ "compatibility_result": "compatible",
822
+ "compatibility_rule": "target surface_version is inside the consumer's accepted_surface_range",
823
+ "transitions": [
824
+ {
825
+ "from": "1.13.0",
826
+ "to": "1.14.0"
827
+ }
828
+ ]
829
+ },
830
+ "release_ledger": {
831
+ "ledger_schema_version": "campaigns-os-release-ledger/v1",
832
+ "entries": [
833
+ {
834
+ "id": "RL-0001",
835
+ "sequence": 1,
836
+ "date": "2026-08-28",
837
+ "kind": "release",
838
+ "surface_version": "1.14.0",
839
+ "changelog_section": "1.14.0",
840
+ "changelog_sha256": "3333333333333333333333333333333333333333333333333333333333333333",
841
+ "agent_impact": "A consumer may now read the orientation contract and release ledger from Git objects.",
842
+ "compatibility": "additive",
843
+ "migration": "none",
844
+ "affected_surface_entries": [
845
+ "contracts/release-ledger.json"
846
+ ],
847
+ "changes": [
848
+ {
849
+ "class": "named_surface",
850
+ "path": "contracts/release-ledger.json",
851
+ "surface_entry": "contracts/release-ledger.json",
852
+ "summary": "The append-only agent-relevant release ledger was introduced."
853
+ }
854
+ ],
855
+ "entry_sha256": "3333333333333333333333333333333333333333333333333333333333333333",
856
+ "introducing_commit": "2222222222222222222222222222222222222222"
857
+ }
858
+ ]
859
+ },
860
+ "changelog": {
861
+ "sections": [
862
+ {
863
+ "section_id": "1.14.0",
864
+ "date": "2026-08-28",
865
+ "agent_impact": "A consumer may now read the orientation contract and release ledger from Git objects.",
866
+ "migration_action": "none",
867
+ "body_markdown": "## [1.14.0] - 2026-08-28\n\n### Added\n\n- The orientation contract and the agent-relevant release ledger.",
868
+ "body_sha256": "3333333333333333333333333333333333333333333333333333333333333333"
869
+ }
870
+ ]
871
+ },
872
+ "runtime": {
873
+ "recipe_id": null,
874
+ "source_fingerprint": "3333333333333333333333333333333333333333333333333333333333333333",
875
+ "generated_state": "fresh",
876
+ "emitter_commit": "1111111111111111111111111111111111111111",
877
+ "refresh_action": "none",
878
+ "ready": true
879
+ },
880
+ "transaction": {
881
+ "state": "reconciled",
882
+ "commit_before": "1111111111111111111111111111111111111111",
883
+ "commit_target": "2222222222222222222222222222222222222222",
884
+ "commit_observed": "2222222222222222222222222222222222222222",
885
+ "recovered_interrupted_update": true,
886
+ "reason_code": "transaction_reconciled"
887
+ },
888
+ "outcome": {
889
+ "disposition": "recovered_interrupted_update",
890
+ "reason_code": "transaction_reconciled",
891
+ "active_generation_changed": true,
892
+ "fresh_exec_required": true,
893
+ "next_actions": [
894
+ "start a fresh session against the reconciled generation"
895
+ ]
896
+ },
897
+ "limits": {
898
+ "limits_version": "1.0.0",
899
+ "max_source_bytes": 1048576,
900
+ "max_section_count": 1024,
901
+ "max_section_bytes": 65536,
902
+ "max_envelope_bytes": 262144,
903
+ "max_ledger_entries": 1024,
904
+ "applied": {
905
+ "source_bytes": 22024,
906
+ "section_count": 8,
907
+ "max_observed_section_bytes": 3903,
908
+ "envelope_bytes": 4096,
909
+ "ledger_entries": 1
910
+ }
911
+ }
912
+ }
913
+ ```
914
+
915
+ ### `legacy_baseline`
916
+
917
+ ```json
918
+ {
919
+ "schema_version": "campaigns-os-tooling-orientation/v1",
920
+ "request": {
921
+ "run_id": "run-example-0001",
922
+ "checkout_mode": "operator_supplied",
923
+ "mutation_policy": "observe_only",
924
+ "baseline": {
925
+ "kind": "legacy_commit",
926
+ "commit": "1111111111111111111111111111111111111111"
927
+ },
928
+ "accepted_orientation_schemas": [
929
+ "campaigns-os-tooling-orientation/v1"
930
+ ],
931
+ "accepted_surface_range": ">=1.13.0 <2.0.0",
932
+ "manifest_sha256": "3333333333333333333333333333333333333333333333333333333333333333"
933
+ },
934
+ "repository": {
935
+ "owner": "NextCommerceCo",
936
+ "repository": "campaigns-os",
937
+ "branch": "main",
938
+ "upstream": "origin/main",
939
+ "clean": true,
940
+ "shallow": false,
941
+ "graph_relation": "identical",
942
+ "common_git_identity": "managed-store-0001",
943
+ "worktree_identity": "generation-0001",
944
+ "commit_before": "1111111111111111111111111111111111111111",
945
+ "commit_fetched": "1111111111111111111111111111111111111111",
946
+ "commit_after": "1111111111111111111111111111111111111111"
947
+ },
948
+ "freshness": {
949
+ "state": "current",
950
+ "observed_at": "2026-08-28T00:00:00Z",
951
+ "fetch_result": {
952
+ "attempted": true,
953
+ "succeeded": true,
954
+ "duration_ms": 420
955
+ }
956
+ },
957
+ "surface": {
958
+ "reviewed_version": null,
959
+ "target_version": null,
960
+ "current_version": null,
961
+ "compatibility_result": "unknown",
962
+ "compatibility_rule": "the reviewed baseline predates supported surfaces; no version is fabricated for it",
963
+ "transitions": []
964
+ },
965
+ "release_ledger": {
966
+ "ledger_schema_version": "campaigns-os-release-ledger/v1",
967
+ "entries": []
968
+ },
969
+ "changelog": {
970
+ "sections": []
971
+ },
972
+ "runtime": {
973
+ "recipe_id": null,
974
+ "source_fingerprint": null,
975
+ "generated_state": "unknown",
976
+ "emitter_commit": null,
977
+ "refresh_action": "none",
978
+ "ready": false
979
+ },
980
+ "transaction": {
981
+ "state": "none",
982
+ "commit_before": "1111111111111111111111111111111111111111",
983
+ "commit_target": "1111111111111111111111111111111111111111",
984
+ "commit_observed": "1111111111111111111111111111111111111111",
985
+ "recovered_interrupted_update": false
986
+ },
987
+ "outcome": {
988
+ "disposition": "legacy_baseline",
989
+ "reason_code": "orientation_rendered",
990
+ "active_generation_changed": false,
991
+ "fresh_exec_required": false,
992
+ "next_actions": [
993
+ "launch only the already verified operator-supplied checkout",
994
+ "adopt a supported-surface baseline"
995
+ ]
996
+ },
997
+ "limits": {
998
+ "limits_version": "1.0.0",
999
+ "max_source_bytes": 1048576,
1000
+ "max_section_count": 1024,
1001
+ "max_section_bytes": 65536,
1002
+ "max_envelope_bytes": 262144,
1003
+ "max_ledger_entries": 1024,
1004
+ "applied": {
1005
+ "source_bytes": 22024,
1006
+ "section_count": 8,
1007
+ "max_observed_section_bytes": 3903,
1008
+ "envelope_bytes": 4096,
1009
+ "ledger_entries": 1
1010
+ }
1011
+ }
1012
+ }
1013
+ ```
1014
+
1015
+ ### `freshness_unknown`
1016
+
1017
+ ```json
1018
+ {
1019
+ "schema_version": "campaigns-os-tooling-orientation/v1",
1020
+ "request": {
1021
+ "run_id": "run-example-0001",
1022
+ "checkout_mode": "managed",
1023
+ "mutation_policy": "observe_only",
1024
+ "baseline": {
1025
+ "kind": "supported_surface",
1026
+ "commit": "1111111111111111111111111111111111111111",
1027
+ "surface_version": "1.13.0"
1028
+ },
1029
+ "accepted_orientation_schemas": [
1030
+ "campaigns-os-tooling-orientation/v1"
1031
+ ],
1032
+ "accepted_surface_range": ">=1.13.0 <2.0.0",
1033
+ "manifest_sha256": "3333333333333333333333333333333333333333333333333333333333333333"
1034
+ },
1035
+ "repository": {
1036
+ "owner": "NextCommerceCo",
1037
+ "repository": "campaigns-os",
1038
+ "branch": "main",
1039
+ "upstream": "origin/main",
1040
+ "clean": true,
1041
+ "shallow": false,
1042
+ "graph_relation": "unknown",
1043
+ "common_git_identity": "managed-store-0001",
1044
+ "worktree_identity": "generation-0001",
1045
+ "commit_before": "1111111111111111111111111111111111111111",
1046
+ "commit_fetched": null,
1047
+ "commit_after": "1111111111111111111111111111111111111111"
1048
+ },
1049
+ "freshness": {
1050
+ "state": "unknown",
1051
+ "observed_at": "2026-08-28T00:00:00Z",
1052
+ "fetch_result": {
1053
+ "attempted": true,
1054
+ "succeeded": false,
1055
+ "duration_ms": 30000,
1056
+ "reason_code": "fetch_failed"
1057
+ }
1058
+ },
1059
+ "surface": {
1060
+ "reviewed_version": "1.13.0",
1061
+ "target_version": null,
1062
+ "current_version": "1.13.0",
1063
+ "compatibility_result": "unknown",
1064
+ "compatibility_rule": "no target was observed, so compatibility is not decidable",
1065
+ "transitions": []
1066
+ },
1067
+ "release_ledger": {
1068
+ "ledger_schema_version": "campaigns-os-release-ledger/v1",
1069
+ "entries": []
1070
+ },
1071
+ "changelog": {
1072
+ "sections": []
1073
+ },
1074
+ "runtime": {
1075
+ "recipe_id": null,
1076
+ "source_fingerprint": "3333333333333333333333333333333333333333333333333333333333333333",
1077
+ "generated_state": "fresh",
1078
+ "emitter_commit": "1111111111111111111111111111111111111111",
1079
+ "refresh_action": "none",
1080
+ "ready": true
1081
+ },
1082
+ "transaction": {
1083
+ "state": "none",
1084
+ "commit_before": "1111111111111111111111111111111111111111",
1085
+ "commit_target": "1111111111111111111111111111111111111111",
1086
+ "commit_observed": "1111111111111111111111111111111111111111",
1087
+ "recovered_interrupted_update": false
1088
+ },
1089
+ "outcome": {
1090
+ "disposition": "freshness_unknown",
1091
+ "reason_code": "fetch_failed",
1092
+ "active_generation_changed": false,
1093
+ "fresh_exec_required": false,
1094
+ "next_actions": [
1095
+ "restore network access and rerun"
1096
+ ],
1097
+ "refusal_remedy": "Restore network access and rerun. The prior verified generation is left intact and no launch proceeds under strict-latest policy."
1098
+ },
1099
+ "limits": {
1100
+ "limits_version": "1.0.0",
1101
+ "max_source_bytes": 1048576,
1102
+ "max_section_count": 1024,
1103
+ "max_section_bytes": 65536,
1104
+ "max_envelope_bytes": 262144,
1105
+ "max_ledger_entries": 1024,
1106
+ "applied": {
1107
+ "source_bytes": 22024,
1108
+ "section_count": 8,
1109
+ "max_observed_section_bytes": 3903,
1110
+ "envelope_bytes": 4096,
1111
+ "ledger_entries": 1
1112
+ }
1113
+ }
1114
+ }
1115
+ ```
1116
+
1117
+ ### `refused`
1118
+
1119
+ ```json
1120
+ {
1121
+ "schema_version": "campaigns-os-tooling-orientation/v1",
1122
+ "request": {
1123
+ "run_id": "run-example-0001",
1124
+ "checkout_mode": "managed",
1125
+ "mutation_policy": "observe_only",
1126
+ "baseline": {
1127
+ "kind": "supported_surface",
1128
+ "commit": "1111111111111111111111111111111111111111",
1129
+ "surface_version": "1.13.0"
1130
+ },
1131
+ "accepted_orientation_schemas": [
1132
+ "campaigns-os-tooling-orientation/v1"
1133
+ ],
1134
+ "accepted_surface_range": ">=1.13.0 <2.0.0",
1135
+ "manifest_sha256": "3333333333333333333333333333333333333333333333333333333333333333"
1136
+ },
1137
+ "repository": {
1138
+ "owner": "NextCommerceCo",
1139
+ "repository": "campaigns-os",
1140
+ "branch": "main",
1141
+ "upstream": "origin/main",
1142
+ "clean": true,
1143
+ "shallow": false,
1144
+ "graph_relation": "identical",
1145
+ "common_git_identity": "managed-store-0001",
1146
+ "worktree_identity": "generation-0001",
1147
+ "commit_before": "1111111111111111111111111111111111111111",
1148
+ "commit_fetched": "1111111111111111111111111111111111111111",
1149
+ "commit_after": "1111111111111111111111111111111111111111"
1150
+ },
1151
+ "freshness": {
1152
+ "state": "refused",
1153
+ "observed_at": "2026-08-28T00:00:00Z",
1154
+ "fetch_result": {
1155
+ "attempted": true,
1156
+ "succeeded": true,
1157
+ "duration_ms": 610
1158
+ }
1159
+ },
1160
+ "surface": {
1161
+ "reviewed_version": "1.13.0",
1162
+ "target_version": "1.13.0",
1163
+ "current_version": "1.13.0",
1164
+ "compatibility_result": "compatible",
1165
+ "compatibility_rule": "target surface_version is inside the consumer's accepted_surface_range",
1166
+ "transitions": []
1167
+ },
1168
+ "release_ledger": {
1169
+ "ledger_schema_version": "campaigns-os-release-ledger/v1",
1170
+ "entries": []
1171
+ },
1172
+ "changelog": {
1173
+ "sections": []
1174
+ },
1175
+ "runtime": {
1176
+ "recipe_id": null,
1177
+ "source_fingerprint": "3333333333333333333333333333333333333333333333333333333333333333",
1178
+ "generated_state": "fresh",
1179
+ "emitter_commit": "1111111111111111111111111111111111111111",
1180
+ "refresh_action": "none",
1181
+ "ready": true
1182
+ },
1183
+ "transaction": {
1184
+ "state": "none",
1185
+ "commit_before": "1111111111111111111111111111111111111111",
1186
+ "commit_target": "1111111111111111111111111111111111111111",
1187
+ "commit_observed": "1111111111111111111111111111111111111111",
1188
+ "recovered_interrupted_update": false
1189
+ },
1190
+ "outcome": {
1191
+ "disposition": "refused",
1192
+ "reason_code": "orientation_too_large",
1193
+ "active_generation_changed": false,
1194
+ "fresh_exec_required": false,
1195
+ "next_actions": [
1196
+ "adopt a newer reviewed baseline",
1197
+ "raise the limit as a reviewed policy change"
1198
+ ],
1199
+ "refusal_remedy": "Adopt a newer reviewed baseline so the window is smaller, or raise the limit as a reviewed policy change that advances limits_version and carries its own ledger entry. Orientation refuses; it never truncates."
1200
+ },
1201
+ "limits": {
1202
+ "limits_version": "1.0.0",
1203
+ "max_source_bytes": 1048576,
1204
+ "max_section_count": 1024,
1205
+ "max_section_bytes": 65536,
1206
+ "max_envelope_bytes": 262144,
1207
+ "max_ledger_entries": 1024,
1208
+ "applied": {
1209
+ "source_bytes": 1048577,
1210
+ "section_count": 8,
1211
+ "max_observed_section_bytes": 3903,
1212
+ "envelope_bytes": 4096,
1213
+ "ledger_entries": 1
1214
+ },
1215
+ "exceeded": [
1216
+ "max_source_bytes"
1217
+ ]
1218
+ }
1219
+ }
1220
+ ```