@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,343 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://nextcommerce.com/schemas/campaigns-os-run-record.v0.schema.json",
4
+ "title": "Campaigns OS Run Record v0",
5
+ "description": "A per-run manifest for one Campaigns OS run. Keyed by one canonical run_id. References source artifacts by {path, schema_version, sha256, material_fingerprint} where available and carries normalized observation arrays — it does NOT re-embed full artifact bodies (so it survives upstream schema drift). Capture is always local; consent gates remit only. See docs/workflow-findings-sidecar.md (Run Telemetry).",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schema_version",
10
+ "run_id",
11
+ "package_version",
12
+ "command",
13
+ "argv_shape",
14
+ "created_at",
15
+ "consent_state",
16
+ "remit_attempted"
17
+ ],
18
+ "properties": {
19
+ "schema_version": {
20
+ "const": "campaigns-os-run-record/v0"
21
+ },
22
+ "run_id": {
23
+ "type": "string",
24
+ "minLength": 1,
25
+ "description": "The single canonical run identity, minted at the run boundary. Also the idempotency key for remit — the endpoint upserts on run_id so retries/reruns never double-count."
26
+ },
27
+ "package_version": {
28
+ "type": "string",
29
+ "minLength": 1,
30
+ "description": "Version of the @nextcommerce/campaigns-os package that produced this record."
31
+ },
32
+ "surface_version": {
33
+ "type": ["string", "null"],
34
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
35
+ "description": "supported-surface version (contracts/supported-surface.json) of the toolkit that produced this record — the version signal consumers can segment on, since package_version has not moved off 0.1.0-alpha.0. Null when the manifest is unreadable."
36
+ },
37
+ "toolkit_commit": {
38
+ "type": ["string", "null"],
39
+ "pattern": "^[0-9a-f]{7,40}$",
40
+ "description": "Git commit the toolkit was installed from: package.json gitHead (stamped on git-dependency installs), else the checkout HEAD. Null when neither is available."
41
+ },
42
+ "command": {
43
+ "type": "string",
44
+ "minLength": 1,
45
+ "description": "The command that ran, e.g. \"run-record\", \"start\", \"qa run\"."
46
+ },
47
+ "argv_shape": {
48
+ "type": "array",
49
+ "items": { "type": "string" },
50
+ "description": "The flag NAMES present on the command line (e.g. \"--packet\", \"--write\"), never their raw values. Shape only — minimization."
51
+ },
52
+ "created_at": {
53
+ "type": "string",
54
+ "minLength": 1,
55
+ "description": "ISO 8601 timestamp the record was assembled."
56
+ },
57
+ "consent_state": {
58
+ "type": "string",
59
+ "enum": ["on", "off"],
60
+ "description": "Resolved telemetry consent at capture time. Gates remit only; capture is always local."
61
+ },
62
+ "consent_source": {
63
+ "type": ["string", "null"],
64
+ "enum": ["env", "file", "default", null],
65
+ "description": "Where consent_state was resolved from. \"default\" means unknown/non-interactive — fails closed to off."
66
+ },
67
+ "remit_attempted": {
68
+ "type": "boolean",
69
+ "description": "Whether a remit POST was attempted for this run."
70
+ },
71
+ "remit_state": {
72
+ "type": "string",
73
+ "enum": ["skipped", "pending", "ok", "failed"],
74
+ "description": "Crash-safe lifecycle state for remit. pending means local capture completed before a consented remit finished; skipped means no remit was attempted."
75
+ },
76
+ "remit_ok": {
77
+ "type": ["boolean", "null"],
78
+ "description": "Whether the remit POST succeeded. null when no attempt was made."
79
+ },
80
+ "remit_error": {
81
+ "type": ["string", "null"],
82
+ "description": "Error message from a failed remit, so a dropped send is visible and not silent. null on success or no attempt."
83
+ },
84
+ "remit_endpoint": {
85
+ "type": ["string", "null"],
86
+ "pattern": "^/",
87
+ "description": "Endpoint path the run was remitted to, e.g. \"/api/runs\". null when no attempt was made."
88
+ },
89
+ "remit_result": {
90
+ "type": ["string", "null"],
91
+ "enum": ["stored", "already_stored", "ok_unparsed_ack", "refused", "transport_error", null],
92
+ "description": "What the receiver answered, classified: stored (parsed 2xx), already_stored (409 — the receiver already holds this run_id), ok_unparsed_ack (2xx with a non-JSON body), refused (other non-2xx), transport_error (no answer). null when no attempt was made. The copy the receiver stores carries stored, by construction."
93
+ },
94
+ "remit_base_kind": {
95
+ "type": ["string", "null"],
96
+ "enum": ["canonical", "loopback", "proxy", null],
97
+ "description": "The remit base the send resolved to, as a kind rather than a host: canonical (the default endpoint), loopback (a receiver on localhost), or proxy (any other --proxy-base). null when no attempt was made."
98
+ },
99
+ "qa_verdict_publish": {
100
+ "type": ["object", "null"],
101
+ "additionalProperties": false,
102
+ "description": "The QA verdict publish outcome recorded for this run (surface 1.33.0): which verdict was posted to the QA portal, by which command, and what the receiver answered, classified into the same vocabulary as remit_result. Absent on records written before the field existed and on runs that produced no verdict. A later `qa publish` of the same verdict reads state ok as already published and refuses without --republish; a stored outcome is never downgraded by a later failed send.",
103
+ "required": ["verdict_run_id", "publisher", "attempted", "state"],
104
+ "properties": {
105
+ "verdict_run_id": {
106
+ "type": "string",
107
+ "minLength": 1,
108
+ "description": "The QA verdict's own run_id (the verdict file name under qa-output/), which is the publish idempotency key. Distinct from this record's run_id."
109
+ },
110
+ "publisher": {
111
+ "type": "string",
112
+ "enum": ["qa run", "qa publish"],
113
+ "description": "The command that made this send: the run that produced the verdict, or a later qa publish of the stored copy."
114
+ },
115
+ "attempted": {
116
+ "type": "boolean",
117
+ "description": "Whether a publish POST was attempted for this verdict."
118
+ },
119
+ "ok": {
120
+ "type": ["boolean", "null"],
121
+ "description": "Whether the publish counts as landed (stored, already_stored or ok_unparsed_ack). null when no attempt was made."
122
+ },
123
+ "error": {
124
+ "type": ["string", "null"],
125
+ "description": "Error message from a failed or anomalous publish. null on a clean success or no attempt."
126
+ },
127
+ "endpoint": {
128
+ "type": ["string", "null"],
129
+ "pattern": "^/",
130
+ "description": "Endpoint path the verdict was posted to, e.g. \"/api/qa/verdicts\". null when no attempt was made."
131
+ },
132
+ "state": {
133
+ "type": "string",
134
+ "enum": ["skipped", "ok", "failed"],
135
+ "description": "skipped: publish was off for the run (no send). ok: the receiver's answer counts as stored. failed: refused or never answered."
136
+ },
137
+ "result": {
138
+ "type": ["string", "null"],
139
+ "enum": ["stored", "already_stored", "ok_unparsed_ack", "refused", "transport_error", null],
140
+ "description": "What the receiver answered, classified as remit_result is. null when no attempt was made."
141
+ },
142
+ "base_kind": {
143
+ "type": ["string", "null"],
144
+ "enum": ["canonical", "loopback", "proxy", null],
145
+ "description": "The proxy base the send resolved to, as a kind rather than a host. null when no attempt was made."
146
+ },
147
+ "published_at": {
148
+ "type": ["string", "null"],
149
+ "description": "ISO 8601 timestamp of the send that landed. null when the publish was skipped or failed."
150
+ }
151
+ }
152
+ },
153
+ "identity": {
154
+ "type": "object",
155
+ "additionalProperties": false,
156
+ "description": "Best-effort run identity — the join keys that make telemetry useful. Missing identity never blocks capture.",
157
+ "properties": {
158
+ "map_id": { "type": ["string", "null"] },
159
+ "campaign_slug": { "type": ["string", "null"] },
160
+ "template_family": { "type": ["string", "null"] },
161
+ "entry_point_shape": {
162
+ "type": ["string", "null"],
163
+ "description": "How the run was entered, e.g. \"packet\", \"spec\", \"map-id\". Shape, not a raw path or id."
164
+ }
165
+ }
166
+ },
167
+ "artifacts": {
168
+ "type": "array",
169
+ "description": "References to this run's source artifacts. References, not copies — this is what survives upstream schema drift. schema_version/sha256/material_fingerprint are nullable for artifacts that are not on disk or whose hash/fingerprint could not be read.",
170
+ "items": {
171
+ "type": "object",
172
+ "additionalProperties": false,
173
+ "required": ["kind", "path"],
174
+ "properties": {
175
+ "kind": {
176
+ "type": "string",
177
+ "enum": [
178
+ "build_packet",
179
+ "build_brief",
180
+ "design_source_package",
181
+ "build_context",
182
+ "assembly_report",
183
+ "page_kit_build_summary",
184
+ "qa_verdict",
185
+ "findings_journal"
186
+ ]
187
+ },
188
+ "path": {
189
+ "type": "string",
190
+ "minLength": 1,
191
+ "description": "Relativized-or-hashed path. Never an absolute contributor filesystem path."
192
+ },
193
+ "schema_version": { "type": ["string", "null"] },
194
+ "sha256": { "type": ["string", "null"] },
195
+ "material_fingerprint": { "type": ["string", "null"] }
196
+ }
197
+ }
198
+ },
199
+ "observations": {
200
+ "type": "object",
201
+ "additionalProperties": false,
202
+ "description": "Normalized observation arrays — the extracted structural signal. Codes/IDs/dispositions only, never raw artifact bodies.",
203
+ "properties": {
204
+ "doctor": {
205
+ "type": "object",
206
+ "additionalProperties": false,
207
+ "properties": {
208
+ "status": { "type": ["string", "null"] },
209
+ "error_codes": { "type": "array", "items": { "type": "string" } },
210
+ "warning_codes": { "type": "array", "items": { "type": "string" } },
211
+ "ready_count": { "type": ["integer", "null"] }
212
+ }
213
+ },
214
+ "spec_validation_rule_ids": {
215
+ "type": "array",
216
+ "items": { "type": "string" },
217
+ "description": "ruleId of every spec.validation violation that fired."
218
+ },
219
+ "adapter_decisions": {
220
+ "type": ["object", "null"],
221
+ "description": "Normalized adapter decision values (strategy enums), not source files."
222
+ },
223
+ "qa": {
224
+ "type": "object",
225
+ "additionalProperties": false,
226
+ "properties": {
227
+ "disposition": { "type": ["string", "null"] },
228
+ "gap_classes": {
229
+ "type": "array",
230
+ "items": { "type": "string" },
231
+ "description": "Distinct assertion families that produced a QA exception (e.g. \"funnel-flow\", \"meta-tags\")."
232
+ }
233
+ }
234
+ },
235
+ "finding_ids": {
236
+ "type": "array",
237
+ "items": { "type": "string" },
238
+ "description": "IDs of this run's Workflow Findings (the per-run findings snapshot, by reference). The journal is the single writer; this is an exact snapshot when findings carry run_id."
239
+ },
240
+ "findings_journal": {
241
+ "type": "object",
242
+ "additionalProperties": false,
243
+ "description": "Integrity metadata for the findings journal snapshot. Present when malformed JSONL lines were skipped so the snapshot is visibly incomplete.",
244
+ "properties": {
245
+ "malformed_count": { "type": "integer" },
246
+ "malformed_lines": {
247
+ "type": "array",
248
+ "items": { "type": "integer" }
249
+ }
250
+ }
251
+ }
252
+ }
253
+ },
254
+ "surfaces": {
255
+ "type": "array",
256
+ "description": "Improvement surfaces this run's signal should inform. A list, not an enum — real signal is rarely one surface.",
257
+ "items": {
258
+ "type": "string",
259
+ "enum": [
260
+ "skill",
261
+ "cli",
262
+ "template",
263
+ "design-source",
264
+ "docs",
265
+ "spec-rule",
266
+ "platform"
267
+ ]
268
+ }
269
+ },
270
+ "primary_surface": {
271
+ "type": ["string", "null"],
272
+ "enum": [
273
+ "skill",
274
+ "cli",
275
+ "template",
276
+ "design-source",
277
+ "docs",
278
+ "spec-rule",
279
+ "platform",
280
+ null
281
+ ],
282
+ "description": "Optional best single-guess surface."
283
+ },
284
+ "surface_confidence": {
285
+ "type": ["string", "null"],
286
+ "description": "Optional free-form confidence hint for primary_surface, e.g. \"low\"."
287
+ },
288
+ "agent_usage": {
289
+ "type": "object",
290
+ "additionalProperties": false,
291
+ "description": "Optional host-supplied agent runtime usage. Campaigns OS does not infer these values; outer runners provide them when available.",
292
+ "properties": {
293
+ "input_tokens": { "type": "integer", "minimum": 0 },
294
+ "output_tokens": { "type": "integer", "minimum": 0 },
295
+ "tool_output_tokens": { "type": "integer", "minimum": 0 },
296
+ "total_tokens": { "type": "integer", "minimum": 0 },
297
+ "elapsed_ms": { "type": "integer", "minimum": 0 },
298
+ "model": { "type": "string" },
299
+ "source": { "type": "string" }
300
+ }
301
+ },
302
+ "lifecycle": {
303
+ "type": ["object", "null"],
304
+ "additionalProperties": false,
305
+ "description": "Optional command-lifecycle signal for this run, correlated by run_id. See per-field descriptions.",
306
+ "properties": {
307
+ "run_id": { "type": ["string", "null"] },
308
+ "command": { "type": "string" },
309
+ "argv_shape": {
310
+ "type": "array",
311
+ "items": { "type": "string" },
312
+ "description": "Flag names present, never their values."
313
+ },
314
+ "exit_status": { "type": ["integer", "null"] },
315
+ "started_at": { "type": ["string", "null"] },
316
+ "completed_at": { "type": ["string", "null"] },
317
+ "duration_ms": { "type": ["number", "null"] },
318
+ "wall_clock_duration_ms": {
319
+ "type": ["number", "null"],
320
+ "description": "Elapsed wall-clock span from the earliest command start to the latest command completion. Kept separate from duration_ms, which sums active command execution time."
321
+ },
322
+ "stages": {
323
+ "type": "array",
324
+ "description": "Per-stage timings, populated by run-record aggregating the lifecycle journal for this run_id. One stage per command invocation (name = command), or `command:phase` when a command marked its own sub-phases.",
325
+ "items": {
326
+ "type": "object",
327
+ "additionalProperties": false,
328
+ "required": ["name"],
329
+ "properties": {
330
+ "name": { "type": "string" },
331
+ "duration_ms": { "type": ["number", "null"] },
332
+ "exit_status": { "type": ["integer", "null"] }
333
+ }
334
+ }
335
+ },
336
+ "repair_loop_count": {
337
+ "type": ["integer", "null"],
338
+ "description": "Re-runs of any command within the run (a re-run is a repair loop: doctor -> fix -> doctor). 0 when each command ran once."
339
+ }
340
+ }
341
+ }
342
+ }
343
+ }