@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,381 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://nextcommerce.com/schemas/campaigns-os-tooling-orientation.v1.schema.json",
4
+ "title": "Campaigns OS Tooling Orientation v1",
5
+ "description": "The versioned envelope a Campaigns OS consumer assembles before binding a session to one generation. Campaigns OS declares the facts (supported surface, release ledger, changelog, limits, reason codes); the consumer's own trusted parser reads them from immutable Git objects at a resolved target OID and fills this envelope. Campaigns OS code is never executed to produce it. Ten semantic groups are required; every one is an independent axis, so integrity, freshness, compatibility, runtime readiness, and orientation never collapse into a single boolean. A consumer that recognizes v1 accepts and preserves unknown additive properties without interpreting them; required fields, known types, and safety-critical enums remain strict.",
6
+ "type": "object",
7
+ "additionalProperties": true,
8
+ "required": [
9
+ "schema_version",
10
+ "request",
11
+ "repository",
12
+ "freshness",
13
+ "surface",
14
+ "release_ledger",
15
+ "changelog",
16
+ "runtime",
17
+ "transaction",
18
+ "outcome",
19
+ "limits"
20
+ ],
21
+ "properties": {
22
+ "schema_version": { "const": "campaigns-os-tooling-orientation/v1" },
23
+ "request": {
24
+ "type": "object",
25
+ "additionalProperties": true,
26
+ "required": [
27
+ "run_id",
28
+ "checkout_mode",
29
+ "mutation_policy",
30
+ "baseline",
31
+ "accepted_orientation_schemas",
32
+ "accepted_surface_range",
33
+ "manifest_sha256"
34
+ ],
35
+ "properties": {
36
+ "run_id": { "type": "string", "minLength": 1, "description": "Opaque identity for this orientation run." },
37
+ "checkout_mode": {
38
+ "type": "string",
39
+ "enum": ["managed", "operator_supplied"],
40
+ "description": "managed: a consumer-owned generation that policy may later promote. operator_supplied: always inspect-only."
41
+ },
42
+ "mutation_policy": {
43
+ "type": "string",
44
+ "enum": ["observe_only", "managed_update"],
45
+ "description": "The authority this run was granted. observe_only never changes an active generation."
46
+ },
47
+ "baseline": { "$ref": "#/$defs/baseline" },
48
+ "accepted_orientation_schemas": {
49
+ "type": "array",
50
+ "minItems": 1,
51
+ "items": { "type": "string", "minLength": 1 },
52
+ "description": "Orientation schema IDs this consumer accepts. An unknown ID fails closed."
53
+ },
54
+ "accepted_surface_range": {
55
+ "type": "string",
56
+ "minLength": 1,
57
+ "description": "The supported_surface range this consumer accepts, as a range expression it owns."
58
+ },
59
+ "manifest_sha256": { "$ref": "#/$defs/sha256", "description": "Digest of the consumer manifest that produced this request." }
60
+ }
61
+ },
62
+ "repository": {
63
+ "type": "object",
64
+ "additionalProperties": true,
65
+ "description": "Normalized repository identity and graph relation. Carries no credentials and no operator-specific absolute paths; a path here is repository-relative or an opaque identity.",
66
+ "required": [
67
+ "owner",
68
+ "repository",
69
+ "branch",
70
+ "upstream",
71
+ "clean",
72
+ "shallow",
73
+ "graph_relation",
74
+ "common_git_identity",
75
+ "worktree_identity",
76
+ "commit_before",
77
+ "commit_fetched",
78
+ "commit_after"
79
+ ],
80
+ "properties": {
81
+ "owner": { "type": "string", "minLength": 1 },
82
+ "repository": { "type": "string", "minLength": 1 },
83
+ "branch": { "oneOf": [{ "type": "string", "minLength": 1 }, { "type": "null" }], "description": "null when HEAD is detached." },
84
+ "upstream": { "oneOf": [{ "type": "string", "minLength": 1 }, { "type": "null" }] },
85
+ "clean": { "type": "boolean" },
86
+ "shallow": { "type": "boolean" },
87
+ "graph_relation": {
88
+ "type": "string",
89
+ "enum": ["identical", "behind", "ahead", "diverged", "unknown"]
90
+ },
91
+ "common_git_identity": { "type": "string", "minLength": 1, "description": "Opaque identity of the common Git directory, used to serialize shared-metadata access." },
92
+ "worktree_identity": { "type": "string", "minLength": 1, "description": "Opaque identity of the worktree this run observed." },
93
+ "commit_before": { "oneOf": [{ "$ref": "#/$defs/oid" }, { "type": "null" }] },
94
+ "commit_fetched": { "oneOf": [{ "$ref": "#/$defs/oid" }, { "type": "null" }] },
95
+ "commit_after": { "oneOf": [{ "$ref": "#/$defs/oid" }, { "type": "null" }] }
96
+ }
97
+ },
98
+ "freshness": {
99
+ "type": "object",
100
+ "additionalProperties": true,
101
+ "required": ["state", "observed_at", "fetch_result"],
102
+ "properties": {
103
+ "state": {
104
+ "type": "string",
105
+ "enum": ["current", "available", "updated", "unknown", "refused"]
106
+ },
107
+ "observed_at": { "type": "string", "minLength": 1, "description": "RFC 3339 timestamp of the observation." },
108
+ "fetch_result": {
109
+ "type": "object",
110
+ "additionalProperties": true,
111
+ "required": ["attempted", "succeeded", "duration_ms"],
112
+ "properties": {
113
+ "attempted": { "type": "boolean" },
114
+ "succeeded": { "type": "boolean" },
115
+ "duration_ms": { "type": "integer", "minimum": 0 },
116
+ "reason_code": { "$ref": "#/$defs/reason_code" }
117
+ }
118
+ }
119
+ }
120
+ },
121
+ "surface": {
122
+ "type": "object",
123
+ "additionalProperties": true,
124
+ "required": ["reviewed_version", "target_version", "current_version", "compatibility_result", "compatibility_rule", "transitions"],
125
+ "properties": {
126
+ "reviewed_version": { "oneOf": [{ "$ref": "#/$defs/semver" }, { "type": "null" }], "description": "null when the reviewed baseline predates supported surfaces. A legacy baseline is never given a fabricated version." },
127
+ "target_version": { "oneOf": [{ "$ref": "#/$defs/semver" }, { "type": "null" }] },
128
+ "current_version": { "oneOf": [{ "$ref": "#/$defs/semver" }, { "type": "null" }] },
129
+ "compatibility_result": { "type": "string", "enum": ["compatible", "incompatible", "unknown"] },
130
+ "compatibility_rule": { "type": "string", "minLength": 1, "description": "The rule that produced compatibility_result, stated so the verdict is auditable." },
131
+ "transitions": {
132
+ "type": "array",
133
+ "description": "The actual ordered surface_version transitions between reviewed and target, derived from Git history, not interpolated.",
134
+ "items": {
135
+ "type": "object",
136
+ "additionalProperties": true,
137
+ "required": ["from", "to"],
138
+ "properties": {
139
+ "from": { "oneOf": [{ "$ref": "#/$defs/semver" }, { "type": "null" }] },
140
+ "to": { "$ref": "#/$defs/semver" }
141
+ }
142
+ }
143
+ }
144
+ }
145
+ },
146
+ "release_ledger": {
147
+ "type": "object",
148
+ "additionalProperties": true,
149
+ "description": "Every agent-relevant semantic change between the reviewed baseline and the target commit, same-surface changes included.",
150
+ "required": ["ledger_schema_version", "entries"],
151
+ "properties": {
152
+ "ledger_schema_version": { "const": "campaigns-os-release-ledger/v1" },
153
+ "entries": {
154
+ "type": "array",
155
+ "items": {
156
+ "type": "object",
157
+ "additionalProperties": true,
158
+ "required": ["id", "sequence", "date", "kind", "surface_version", "changelog_section", "changelog_sha256", "agent_impact", "compatibility", "migration", "changes", "entry_sha256", "introducing_commit"],
159
+ "properties": {
160
+ "id": { "type": "string", "pattern": "^RL-[0-9]{4}$" },
161
+ "sequence": { "type": "integer", "minimum": 1 },
162
+ "date": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$" },
163
+ "kind": { "type": "string", "enum": ["release", "amendment"] },
164
+ "amends": { "type": "string", "pattern": "^RL-[0-9]{4}$" },
165
+ "surface_version": { "oneOf": [{ "$ref": "#/$defs/semver" }, { "type": "null" }] },
166
+ "changelog_section": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(\\+agent\\.[0-9]+)?$" },
167
+ "changelog_sha256": { "$ref": "#/$defs/sha256" },
168
+ "agent_impact": { "type": "string", "minLength": 1 },
169
+ "compatibility": { "type": "string", "enum": ["compatible", "additive", "breaking"] },
170
+ "migration": { "type": "string", "minLength": 1 },
171
+ "affected_surface_entries": { "type": "array", "items": { "type": "string", "minLength": 1 } },
172
+ "changes": {
173
+ "type": "array",
174
+ "minItems": 1,
175
+ "items": {
176
+ "type": "object",
177
+ "additionalProperties": true,
178
+ "required": ["class", "path", "surface_entry", "summary"],
179
+ "properties": {
180
+ "class": { "$ref": "#/$defs/change_class" },
181
+ "path": { "oneOf": [{ "type": "string", "minLength": 1 }, { "type": "null" }] },
182
+ "surface_entry": { "oneOf": [{ "type": "string", "minLength": 1 }, { "type": "null" }] },
183
+ "summary": { "type": "string", "minLength": 1 }
184
+ }
185
+ }
186
+ },
187
+ "entry_sha256": { "$ref": "#/$defs/sha256" },
188
+ "introducing_commit": {
189
+ "$ref": "#/$defs/oid",
190
+ "description": "DERIVED by the consumer from Git history at the immutable target OID. The stored ledger entry in contracts/release-ledger.json must NOT carry any commit identifier; that file's schema rejects one."
191
+ }
192
+ }
193
+ }
194
+ }
195
+ }
196
+ },
197
+ "changelog": {
198
+ "type": "object",
199
+ "additionalProperties": true,
200
+ "required": ["sections"],
201
+ "properties": {
202
+ "sections": {
203
+ "type": "array",
204
+ "description": "The exact ordered append-only changelog sections the ledger entries reference. Bodies are carried verbatim; nothing is summarized or truncated.",
205
+ "items": {
206
+ "type": "object",
207
+ "additionalProperties": true,
208
+ "required": ["section_id", "date", "agent_impact", "migration_action", "body_markdown", "body_sha256"],
209
+ "properties": {
210
+ "section_id": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(\\+agent\\.[0-9]+)?$" },
211
+ "date": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$" },
212
+ "agent_impact": { "type": "string", "minLength": 1 },
213
+ "migration_action": { "type": "string", "minLength": 1 },
214
+ "body_markdown": { "type": "string" },
215
+ "body_sha256": { "$ref": "#/$defs/sha256" }
216
+ }
217
+ }
218
+ }
219
+ }
220
+ },
221
+ "runtime": {
222
+ "type": "object",
223
+ "additionalProperties": true,
224
+ "description": "Generated-runtime readiness as an axis independent of source freshness. The declarative recipe contract itself is owned by a separate change (test-plan A2); this group is the envelope shape that carries its result.",
225
+ "required": ["recipe_id", "source_fingerprint", "generated_state", "emitter_commit", "refresh_action", "ready"],
226
+ "properties": {
227
+ "recipe_id": { "oneOf": [{ "type": "string", "minLength": 1 }, { "type": "null" }] },
228
+ "source_fingerprint": { "oneOf": [{ "$ref": "#/$defs/sha256" }, { "type": "null" }] },
229
+ "generated_state": { "type": "string", "enum": ["absent", "stale", "fresh", "corrupt", "unknown"] },
230
+ "emitter_commit": { "oneOf": [{ "$ref": "#/$defs/oid" }, { "type": "null" }], "description": "The exact commit whose bytes produced the CLI in the observed generation." },
231
+ "refresh_action": { "type": "string", "enum": ["none", "prepare_new_generation", "refused"] },
232
+ "ready": { "type": "boolean" },
233
+ "reason_code": { "$ref": "#/$defs/reason_code" }
234
+ }
235
+ },
236
+ "transaction": {
237
+ "type": "object",
238
+ "additionalProperties": true,
239
+ "required": ["state", "commit_before", "commit_target", "commit_observed", "recovered_interrupted_update"],
240
+ "properties": {
241
+ "state": { "type": "string", "enum": ["none", "requested", "intent_recorded", "finalized", "reconciled", "failed"] },
242
+ "commit_before": { "oneOf": [{ "$ref": "#/$defs/oid" }, { "type": "null" }] },
243
+ "commit_target": { "oneOf": [{ "$ref": "#/$defs/oid" }, { "type": "null" }] },
244
+ "commit_observed": { "oneOf": [{ "$ref": "#/$defs/oid" }, { "type": "null" }] },
245
+ "recovered_interrupted_update": { "type": "boolean" },
246
+ "reason_code": { "$ref": "#/$defs/reason_code" }
247
+ }
248
+ },
249
+ "outcome": {
250
+ "type": "object",
251
+ "additionalProperties": true,
252
+ "required": ["disposition", "reason_code", "active_generation_changed", "fresh_exec_required", "next_actions"],
253
+ "properties": {
254
+ "disposition": { "$ref": "#/$defs/disposition" },
255
+ "reason_code": { "$ref": "#/$defs/reason_code" },
256
+ "active_generation_changed": { "type": "boolean" },
257
+ "fresh_exec_required": { "type": "boolean" },
258
+ "next_actions": {
259
+ "type": "array",
260
+ "items": { "type": "string", "minLength": 1 },
261
+ "description": "Safe actions only. A refusal's remedy comes from contracts/orientation-reason-codes.v1.json and is deterministic for the code."
262
+ },
263
+ "refusal_remedy": { "type": "string", "minLength": 1, "description": "Required in practice on disposition: refused; the deterministic remedy for reason_code." }
264
+ }
265
+ },
266
+ "limits": {
267
+ "type": "object",
268
+ "additionalProperties": true,
269
+ "description": "The versioned limits actually applied to this run, copied from contracts/orientation-limits.v1.json. Exceeding any of them is a refusal with reason_code orientation_too_large; nothing is truncated.",
270
+ "required": ["limits_version", "max_source_bytes", "max_section_count", "max_section_bytes", "max_envelope_bytes", "max_ledger_entries", "applied"],
271
+ "properties": {
272
+ "limits_version": { "$ref": "#/$defs/semver" },
273
+ "max_source_bytes": { "type": "integer", "minimum": 1 },
274
+ "max_section_count": { "type": "integer", "minimum": 1 },
275
+ "max_section_bytes": { "type": "integer", "minimum": 1 },
276
+ "max_envelope_bytes": { "type": "integer", "minimum": 1 },
277
+ "max_ledger_entries": { "type": "integer", "minimum": 1 },
278
+ "applied": {
279
+ "type": "object",
280
+ "additionalProperties": true,
281
+ "description": "What this run actually measured, so a near-limit read is visible before it becomes a refusal.",
282
+ "required": ["source_bytes", "section_count", "max_observed_section_bytes", "envelope_bytes", "ledger_entries"],
283
+ "properties": {
284
+ "source_bytes": { "type": "integer", "minimum": 0 },
285
+ "section_count": { "type": "integer", "minimum": 0 },
286
+ "max_observed_section_bytes": { "type": "integer", "minimum": 0 },
287
+ "envelope_bytes": { "type": "integer", "minimum": 0 },
288
+ "ledger_entries": { "type": "integer", "minimum": 0 }
289
+ }
290
+ },
291
+ "exceeded": {
292
+ "type": "array",
293
+ "items": { "type": "string", "enum": ["max_source_bytes", "max_section_count", "max_section_bytes", "max_envelope_bytes", "max_ledger_entries"] },
294
+ "description": "Non-empty only alongside reason_code orientation_too_large. Names every limit that was exceeded, not just the first."
295
+ }
296
+ }
297
+ }
298
+ },
299
+ "$defs": {
300
+ "oid": { "type": "string", "pattern": "^[0-9a-f]{40}$" },
301
+ "sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
302
+ "semver": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$" },
303
+ "baseline": {
304
+ "type": "object",
305
+ "additionalProperties": true,
306
+ "required": ["kind", "commit"],
307
+ "properties": {
308
+ "kind": {
309
+ "type": "string",
310
+ "enum": ["legacy_commit", "supported_surface"],
311
+ "description": "legacy_commit: a reviewed baseline predating supported surfaces. It never receives a fabricated surface_version."
312
+ },
313
+ "commit": { "$ref": "#/$defs/oid" },
314
+ "surface_version": { "$ref": "#/$defs/semver", "description": "Present only on kind: supported_surface." }
315
+ }
316
+ },
317
+ "change_class": {
318
+ "type": "string",
319
+ "description": "Defined once in contracts/agent-relevant-change-policy.v1.json; this enum is checked against that file.",
320
+ "enum": [
321
+ "schema",
322
+ "hashed_surface",
323
+ "named_surface",
324
+ "cli_surface",
325
+ "skill",
326
+ "package_export",
327
+ "compatibility_policy",
328
+ "documentation",
329
+ "workflow",
330
+ "generated_runtime"
331
+ ]
332
+ },
333
+ "disposition": {
334
+ "type": "string",
335
+ "description": "The eight minimum terminal outcomes. Every orientation run ends on exactly one.",
336
+ "enum": [
337
+ "current",
338
+ "orientation_available",
339
+ "updated",
340
+ "restart_required",
341
+ "recovered_interrupted_update",
342
+ "legacy_baseline",
343
+ "freshness_unknown",
344
+ "refused"
345
+ ]
346
+ },
347
+ "reason_code": {
348
+ "type": "string",
349
+ "description": "The stable reason-code vocabulary. Meanings, deterministic remedies, and owning test IDs live in contracts/orientation-reason-codes.v1.json; this enum is checked against that file's keys exactly.",
350
+ "enum": [
351
+ "already_current",
352
+ "ahead_of_upstream",
353
+ "checkout_acquisition_failed",
354
+ "checkout_already_exists",
355
+ "checkout_missing",
356
+ "checkout_mutation_not_authorized",
357
+ "detached_head",
358
+ "dirty_checkout",
359
+ "diverged_history",
360
+ "evidence_budget_exceeded",
361
+ "fetch_failed",
362
+ "git_environment_unsafe",
363
+ "history_incomplete",
364
+ "missing_upstream",
365
+ "orientation_contract_missing",
366
+ "orientation_in_progress",
367
+ "orientation_incomplete",
368
+ "orientation_rendered",
369
+ "orientation_too_large",
370
+ "pointer_race",
371
+ "runtime_commit_mismatch",
372
+ "runtime_refresh_failed",
373
+ "runtime_refresh_required",
374
+ "surface_incompatible",
375
+ "transaction_incomplete",
376
+ "transaction_reconciled",
377
+ "wrong_remote"
378
+ ]
379
+ }
380
+ }
381
+ }
@@ -0,0 +1,134 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://nextcommerce.com/schemas/campaigns-os-workflow-finding.v0.schema.json",
4
+ "title": "Campaigns OS Workflow Finding v0",
5
+ "description": "One operator-, agent-, or system-observed signal about the Campaigns OS workflow itself. Captured locally to the append-only Findings Journal. Strict about the required core; permissive about optional context fields.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["schema_version", "id", "created_at", "stage", "kind", "summary"],
9
+ "properties": {
10
+ "schema_version": {
11
+ "const": "campaigns-os-workflow-finding/v0"
12
+ },
13
+ "id": {
14
+ "type": "string",
15
+ "minLength": 1,
16
+ "description": "Stable unique local ID, e.g. wf_<timestamp>_<random>. Local-only; not a cross-run primary key."
17
+ },
18
+ "created_at": {
19
+ "type": "string",
20
+ "minLength": 1,
21
+ "description": "ISO 8601 timestamp of capture."
22
+ },
23
+ "stage": {
24
+ "type": "string",
25
+ "enum": [
26
+ "overall",
27
+ "intake",
28
+ "start",
29
+ "doctor",
30
+ "setup",
31
+ "build",
32
+ "polish",
33
+ "deploy",
34
+ "qa",
35
+ "test-order",
36
+ "next"
37
+ ],
38
+ "description": "Observation Stage: the lifecycle moment where the finding was noticed."
39
+ },
40
+ "kind": {
41
+ "type": "string",
42
+ "enum": [
43
+ "positive_signal",
44
+ "friction",
45
+ "missing_prompt",
46
+ "blocker",
47
+ "docs_gap",
48
+ "automation_gap",
49
+ "idea"
50
+ ],
51
+ "description": "Small operator-facing classification. Not a Linear label or priority."
52
+ },
53
+ "summary": {
54
+ "type": "string",
55
+ "minLength": 1,
56
+ "description": "Short one-line description of the finding."
57
+ },
58
+ "details": {
59
+ "type": ["string", "null"]
60
+ },
61
+ "expected": {
62
+ "type": ["string", "null"]
63
+ },
64
+ "actual": {
65
+ "type": ["string", "null"]
66
+ },
67
+ "severity": {
68
+ "type": ["string", "null"],
69
+ "description": "Free-form operator severity hint. Not a launch gate."
70
+ },
71
+ "artifact_paths": {
72
+ "type": "array",
73
+ "items": { "type": "string" },
74
+ "description": "References to artifacts (packet, report, doctor output, QA verdict). Paths only — not contents."
75
+ },
76
+ "command": {
77
+ "type": ["string", "null"]
78
+ },
79
+ "command_exit_status": {
80
+ "type": ["integer", "null"]
81
+ },
82
+ "source_type": {
83
+ "type": ["string", "null"]
84
+ },
85
+ "template_family": {
86
+ "type": ["string", "null"]
87
+ },
88
+ "map_id": {
89
+ "type": ["string", "null"]
90
+ },
91
+ "campaign_slug": {
92
+ "type": ["string", "null"]
93
+ },
94
+ "target_repo": {
95
+ "type": ["string", "null"]
96
+ },
97
+ "packet_path": {
98
+ "type": ["string", "null"]
99
+ },
100
+ "assembly_report_path": {
101
+ "type": ["string", "null"]
102
+ },
103
+ "qa_run_id": {
104
+ "type": ["string", "null"]
105
+ },
106
+ "run_id": {
107
+ "type": ["string", "null"],
108
+ "description": "Optional canonical Run Telemetry run_id. Lets a per-run Run Record snapshot this finding by ID exactly, rather than inferring run membership from timestamps. Backward-compatible: absent on findings captured before Run Telemetry."
109
+ },
110
+ "author_type": {
111
+ "type": "string",
112
+ "enum": ["operator", "agent", "system"],
113
+ "description": "Source of the finding. Agents may record observed workflow gaps but must not invent subjective operator feedback."
114
+ },
115
+ "evidence_quality": {
116
+ "type": "string",
117
+ "enum": [
118
+ "operator_report",
119
+ "artifact_referenced",
120
+ "artifact_attached",
121
+ "system_observed"
122
+ ],
123
+ "description": "Declared strength of evidence. Lets useful weak signals enter the Learning Trail without pretending to be QA Verdicts."
124
+ },
125
+ "suggested_owner": {
126
+ "type": ["string", "null"],
127
+ "description": "Optional routing aid for later internal aggregation. Not the first clustering dimension."
128
+ },
129
+ "safe_to_share": {
130
+ "type": ["boolean", "null"],
131
+ "description": "Operator hint that this finding's summary/references are safe to contribute beyond the workspace. Does not itself trigger any upload."
132
+ }
133
+ }
134
+ }