@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.
- package/AGENTS.md +204 -0
- package/CHANGELOG.md +5002 -0
- package/CONTEXT.md +685 -0
- package/LICENSE +202 -0
- package/NOTICE +4 -0
- package/README.md +368 -0
- package/agents/claude/CLAUDE.md +32 -0
- package/agents/codex/AGENTS.md +27 -0
- package/agents/copilot/copilot-instructions.md +14 -0
- package/agents/cursor/campaigns-os.mdc +13 -0
- package/bin/campaigns-os.mjs +38 -0
- package/campaign-spec/README.md +138 -0
- package/campaign-spec/dist/analytics-vocabulary.d.ts +47 -0
- package/campaign-spec/dist/analytics-vocabulary.js +74 -0
- package/campaign-spec/dist/index.d.ts +40 -0
- package/campaign-spec/dist/index.js +77 -0
- package/campaign-spec/dist/normalize.d.ts +22 -0
- package/campaign-spec/dist/normalize.js +41 -0
- package/campaign-spec/dist/routing.d.ts +190 -0
- package/campaign-spec/dist/routing.js +263 -0
- package/campaign-spec/dist/rules/analytics-contract-shape.d.ts +42 -0
- package/campaign-spec/dist/rules/analytics-contract-shape.js +303 -0
- package/campaign-spec/dist/rules/assembly-hints-shape.d.ts +42 -0
- package/campaign-spec/dist/rules/assembly-hints-shape.js +191 -0
- package/campaign-spec/dist/rules/campaign-metadata.d.ts +14 -0
- package/campaign-spec/dist/rules/campaign-metadata.js +40 -0
- package/campaign-spec/dist/rules/checkout-has-success-url.d.ts +31 -0
- package/campaign-spec/dist/rules/checkout-has-success-url.js +66 -0
- package/campaign-spec/dist/rules/cycle-detection.d.ts +12 -0
- package/campaign-spec/dist/rules/cycle-detection.js +141 -0
- package/campaign-spec/dist/rules/design-source-shape.d.ts +29 -0
- package/campaign-spec/dist/rules/design-source-shape.js +142 -0
- package/campaign-spec/dist/rules/downsell-without-upsell.d.ts +11 -0
- package/campaign-spec/dist/rules/downsell-without-upsell.js +40 -0
- package/campaign-spec/dist/rules/exit-intent-validation.d.ts +23 -0
- package/campaign-spec/dist/rules/exit-intent-validation.js +147 -0
- package/campaign-spec/dist/rules/funnel-count.d.ts +9 -0
- package/campaign-spec/dist/rules/funnel-count.js +37 -0
- package/campaign-spec/dist/rules/funnel-hypothesis-length.d.ts +22 -0
- package/campaign-spec/dist/rules/funnel-hypothesis-length.js +60 -0
- package/campaign-spec/dist/rules/funnel-identity.d.ts +15 -0
- package/campaign-spec/dist/rules/funnel-identity.js +57 -0
- package/campaign-spec/dist/rules/funnel-weight-sum.d.ts +20 -0
- package/campaign-spec/dist/rules/funnel-weight-sum.js +66 -0
- package/campaign-spec/dist/rules/index.d.ts +69 -0
- package/campaign-spec/dist/rules/index.js +131 -0
- package/campaign-spec/dist/rules/offer-ref-integrity.d.ts +13 -0
- package/campaign-spec/dist/rules/offer-ref-integrity.js +59 -0
- package/campaign-spec/dist/rules/package-pricing-sanity.d.ts +12 -0
- package/campaign-spec/dist/rules/package-pricing-sanity.js +42 -0
- package/campaign-spec/dist/rules/page-count.d.ts +11 -0
- package/campaign-spec/dist/rules/page-count.js +31 -0
- package/campaign-spec/dist/rules/page-id-uniqueness.d.ts +14 -0
- package/campaign-spec/dist/rules/page-id-uniqueness.js +47 -0
- package/campaign-spec/dist/rules/promo-code-input-validation.d.ts +8 -0
- package/campaign-spec/dist/rules/promo-code-input-validation.js +126 -0
- package/campaign-spec/dist/rules/promo-codes-shape.d.ts +30 -0
- package/campaign-spec/dist/rules/promo-codes-shape.js +187 -0
- package/campaign-spec/dist/rules/route-field-ignored-for-page-type.d.ts +33 -0
- package/campaign-spec/dist/rules/route-field-ignored-for-page-type.js +81 -0
- package/campaign-spec/dist/rules/route-target-resolves.d.ts +32 -0
- package/campaign-spec/dist/rules/route-target-resolves.js +112 -0
- package/campaign-spec/dist/rules/schema-version.d.ts +21 -0
- package/campaign-spec/dist/rules/schema-version.js +53 -0
- package/campaign-spec/dist/rules/sdk-version.d.ts +26 -0
- package/campaign-spec/dist/rules/sdk-version.js +96 -0
- package/campaign-spec/dist/rules/shipping-countries-shape.d.ts +10 -0
- package/campaign-spec/dist/rules/shipping-countries-shape.js +30 -0
- package/campaign-spec/dist/rules/shipping-methods-present.d.ts +10 -0
- package/campaign-spec/dist/rules/shipping-methods-present.js +26 -0
- package/campaign-spec/dist/rules/store-profile-shape.d.ts +30 -0
- package/campaign-spec/dist/rules/store-profile-shape.js +127 -0
- package/campaign-spec/dist/rules/thank-you-requirement.d.ts +16 -0
- package/campaign-spec/dist/rules/thank-you-requirement.js +50 -0
- package/campaign-spec/dist/rules/unknown-top-level-fields.d.ts +28 -0
- package/campaign-spec/dist/rules/unknown-top-level-fields.js +114 -0
- package/campaign-spec/dist/rules/upsell-has-packages.d.ts +9 -0
- package/campaign-spec/dist/rules/upsell-has-packages.js +35 -0
- package/campaign-spec/dist/rules/upsell-routing-complete.d.ts +10 -0
- package/campaign-spec/dist/rules/upsell-routing-complete.js +45 -0
- package/campaign-spec/dist/rules/upsell-without-checkout.d.ts +11 -0
- package/campaign-spec/dist/rules/upsell-without-checkout.js +44 -0
- package/campaign-spec/dist/rules/variant-labels-shape.d.ts +28 -0
- package/campaign-spec/dist/rules/variant-labels-shape.js +86 -0
- package/campaign-spec/dist/sdk-version-parse.d.ts +43 -0
- package/campaign-spec/dist/sdk-version-parse.js +62 -0
- package/campaign-spec/dist/types.d.ts +674 -0
- package/campaign-spec/dist/types.js +40 -0
- package/campaign-spec/package.json +12 -0
- package/compatibility.json +25 -0
- package/contracts/agent-relevant-change-policy.v1.json +111 -0
- package/contracts/brand-theme-source-defaults.figma-sections-export.v0.json +32 -0
- package/contracts/brand-theme-target-tokens.next-core.v0.json +65 -0
- package/contracts/campaign-cart-checkout-field-contract.v0.json +45 -0
- package/contracts/campaign-cart-sdk-support-policy.v0.json +11 -0
- package/contracts/commerce-surface-catalog.json +2452 -0
- package/contracts/fixtures/orientation/canonicalization/v1.json +34 -0
- package/contracts/fixtures/orientation/envelope/current.json +95 -0
- package/contracts/fixtures/orientation/envelope/freshness_unknown.json +97 -0
- package/contracts/fixtures/orientation/envelope/legacy_baseline.json +95 -0
- package/contracts/fixtures/orientation/envelope/orientation_available.json +136 -0
- package/contracts/fixtures/orientation/envelope/recovered_interrupted_update.json +136 -0
- package/contracts/fixtures/orientation/envelope/refused.json +100 -0
- package/contracts/fixtures/orientation/envelope/restart_required.json +137 -0
- package/contracts/fixtures/orientation/envelope/updated.json +135 -0
- package/contracts/fixtures/orientation/hostile-target/README.md +61 -0
- package/contracts/fixtures/orientation/hostile-target/manifest.json +82 -0
- package/contracts/fixtures/orientation/hostile-target/repo/CHANGELOG.md +18 -0
- package/contracts/fixtures/orientation/hostile-target/repo/bin/intended.mjs +12 -0
- package/contracts/fixtures/orientation/hostile-target/repo/bin/tripwire.mjs +15 -0
- package/contracts/fixtures/orientation/hostile-target/repo/contracts/release-ledger.json +48 -0
- package/contracts/fixtures/orientation/hostile-target/repo/contracts/supported-surface.json +17 -0
- package/contracts/fixtures/orientation/hostile-target/repo/docs/example-contract.md +13 -0
- package/contracts/fixtures/orientation/hostile-target/repo/hooks/post-checkout +5 -0
- package/contracts/fixtures/orientation/hostile-target/repo/hooks/post-merge +5 -0
- package/contracts/fixtures/orientation/hostile-target/repo/hooks/pre-commit +5 -0
- package/contracts/fixtures/orientation/hostile-target/repo/hostile-dependency-tripwire/package.json +15 -0
- package/contracts/fixtures/orientation/hostile-target/repo/hostile-dependency-tripwire/tripwire.mjs +9 -0
- package/contracts/fixtures/orientation/hostile-target/repo/package.json +20 -0
- package/contracts/fixtures/orientation/hostile-target/repo/schemas/example.v0.schema.json +15 -0
- package/contracts/fixtures/orientation/release-gate/cases.json +1073 -0
- package/contracts/fixtures/runtime-recipe/accept/current.json +299 -0
- package/contracts/fixtures/runtime-recipe/accept/minimal.json +294 -0
- package/contracts/fixtures/runtime-recipe/dist-states.json +51 -0
- package/contracts/fixtures/runtime-recipe/manifest.json +85 -0
- package/contracts/fixtures/runtime-recipe/reject/advisory-enforcement.json +299 -0
- package/contracts/fixtures/runtime-recipe/reject/allowlist-without-hosts.json +297 -0
- package/contracts/fixtures/runtime-recipe/reject/committed-output-claim.json +299 -0
- package/contracts/fixtures/runtime-recipe/reject/engines-disagreement-warns.json +299 -0
- package/contracts/fixtures/runtime-recipe/reject/lifecycle-scripts-enabled.json +299 -0
- package/contracts/fixtures/runtime-recipe/reject/missing-required-field.json +251 -0
- package/contracts/fixtures/runtime-recipe/reject/unknown-kind.json +299 -0
- package/contracts/fixtures/runtime-recipe/reject/unknown-network-policy.json +299 -0
- package/contracts/fixtures/runtime-recipe/reject/unknown-output-check.json +310 -0
- package/contracts/fixtures/runtime-recipe/reject/unknown-revision.json +299 -0
- package/contracts/fixtures/runtime-recipe/reject/unknown-step-id.json +299 -0
- package/contracts/fixtures/runtime-recipe/reject/unperformable-check-skipped.json +299 -0
- package/contracts/fixtures/runtime-recipe/reject/unpinned-lockfile.json +299 -0
- package/contracts/fixtures/sidecar-bundle/production-shaped/.campaign-runtime/assembly-report.json +180 -0
- package/contracts/fixtures/sidecar-bundle/production-shaped/.campaign-runtime/build-context.json +115 -0
- package/contracts/fixtures/sidecar-bundle/production-shaped/.campaign-runtime/doctor-output.json +29 -0
- package/contracts/fixtures/sidecar-bundle/production-shaped/.campaign-runtime/qa-verdict.json +27 -0
- package/contracts/fixtures/sidecar-bundle/production-shaped/campaign-runtime.build.json +141 -0
- package/contracts/migration-sidecar-bundle.v0.json +149 -0
- package/contracts/orientation-limits.v1.json +41 -0
- package/contracts/orientation-reason-codes.v1.json +196 -0
- package/contracts/private-template-sources.json +8 -0
- package/contracts/release-ledger.json +4598 -0
- package/contracts/reserved-skill-names.json +13 -0
- package/contracts/runtime-recipe.campaigns-os-node-v1.json +299 -0
- package/contracts/supported-surface.json +180 -0
- package/contracts/template-brand-contract.apollo-mv-single-step.v0.json +27 -0
- package/contracts/template-brand-contract.apollo.v0.json +27 -0
- package/contracts/template-brand-contract.demeter.v0.json +27 -0
- package/contracts/template-brand-contract.olympus-mv-single-step.v0.json +27 -0
- package/contracts/template-brand-contract.olympus-mv-two-step.v0.json +28 -0
- package/contracts/template-brand-contract.olympus.v0.json +27 -0
- package/contracts/template-brand-contract.shared-commerce.v0.json +190 -0
- package/contracts/template-brand-contract.shop-single-step.v0.json +27 -0
- package/contracts/template-brand-contract.shop-three-step.v0.json +29 -0
- package/contracts/template-slot-manifest.apollo-mv-single-step.v0.json +14 -0
- package/contracts/template-slot-manifest.apollo.v0.json +12 -0
- package/contracts/template-slot-manifest.demeter.v0.json +30 -0
- package/contracts/template-slot-manifest.olympus-mv-single-step.v0.json +14 -0
- package/contracts/template-slot-manifest.olympus-mv-two-step.v0.json +15 -0
- package/contracts/template-slot-manifest.olympus.v0.json +12 -0
- package/contracts/template-slot-manifest.shared-content-core.v0.json +4254 -0
- package/contracts/template-slot-manifest.shop-single-step.v0.json +47 -0
- package/contracts/template-slot-manifest.shop-three-step.v0.json +33 -0
- package/docs/brand-theme-bridge.md +159 -0
- package/docs/build-packet.md +1300 -0
- package/docs/campaign-build-brief.md +145 -0
- package/docs/campaign-standardization-report.md +329 -0
- package/docs/campaigns-os-build-flow.md +117 -0
- package/docs/design-source-package.md +784 -0
- package/docs/legacy-migration.md +58 -0
- package/docs/migration-sidecar-bundle.md +139 -0
- package/docs/orientation-contract-reference.md +1220 -0
- package/docs/polish-evidence.md +502 -0
- package/docs/qa-and-test-orders.md +1691 -0
- package/docs/release-ledger-authoring-guide.md +274 -0
- package/docs/runtime-readiness.md +211 -0
- package/docs/supported-surface.md +83 -0
- package/docs/versioning.md +55 -0
- package/docs/workflow-findings-sidecar.md +588 -0
- package/package.json +135 -0
- package/prompts/first-build.md +27 -0
- package/prompts/friction-log.md +30 -0
- package/schemas/campaign-build-brief.v1.schema.json +149 -0
- package/schemas/campaign-design-source-package.v0.schema.json +697 -0
- package/schemas/campaign-runtime-assembly-report.v0.schema.json +390 -0
- package/schemas/campaign-runtime-build-context.v0.schema.json +339 -0
- package/schemas/campaign-runtime-build-packet.v0.schema.json +452 -0
- package/schemas/campaign-spec.v4.schema.json +582 -0
- package/schemas/campaigns-os-doctor-output.v0.schema.json +43 -0
- package/schemas/campaigns-os-legacy-migration-inventory.v0.schema.json +112 -0
- package/schemas/campaigns-os-legacy-provisioning-plan.v0.schema.json +38 -0
- package/schemas/campaigns-os-legacy-provisioning-receipt.v0.schema.json +57 -0
- package/schemas/campaigns-os-qa-verdict-sidecar.v0.schema.json +150 -0
- package/schemas/campaigns-os-qa-verdict.v0.schema.json +438 -0
- package/schemas/campaigns-os-release-ledger.v1.schema.json +162 -0
- package/schemas/campaigns-os-run-record.v0.schema.json +343 -0
- package/schemas/campaigns-os-runtime-recipe.v1.schema.json +313 -0
- package/schemas/campaigns-os-sidecar-bundle-conformance.v0.schema.json +78 -0
- package/schemas/campaigns-os-tooling-orientation.v1.schema.json +381 -0
- package/schemas/campaigns-os-workflow-finding.v0.schema.json +134 -0
- package/schemas/source-html-manifest.v0.schema.json +252 -0
- package/skills/next-campaigns-build/SKILL.md +73 -0
- package/skills/next-campaigns-os/SKILL.md +101 -0
- package/skills/next-campaigns-os/references/session-intake.md +160 -0
- package/skills/next-campaigns-os-setup/SKILL.md +22 -0
- package/skills/next-campaigns-polish/SKILL.md +145 -0
- package/skills/next-campaigns-qa/SKILL.md +92 -0
- package/skills.json +56 -0
- package/skills.sh +64 -0
- package/src/adapter-decision-contract.mjs +333 -0
- package/src/brand-theme.mjs +1151 -0
- package/src/browser-launch.mjs +79 -0
- package/src/build-brief.mjs +781 -0
- package/src/built-site-scope.mjs +312 -0
- package/src/campaign-ecosystem.mjs +734 -0
- package/src/campaign-identity.mjs +405 -0
- package/src/campaign-workspace.mjs +127 -0
- package/src/checkpoint-waiver.mjs +302 -0
- package/src/cli.mjs +13442 -0
- package/src/commercial-journey.mjs +1119 -0
- package/src/commercial-parity.mjs +965 -0
- package/src/consent.mjs +347 -0
- package/src/content-residue.mjs +322 -0
- package/src/deadline.mjs +81 -0
- package/src/design-source-package.mjs +2604 -0
- package/src/deviation.mjs +107 -0
- package/src/doctor-check-registry.mjs +49 -0
- package/src/doctor-sidecar.mjs +106 -0
- package/src/finding-cause.mjs +557 -0
- package/src/findings.mjs +326 -0
- package/src/fs-identity.mjs +68 -0
- package/src/gate-actions.mjs +105 -0
- package/src/html-scan.mjs +53 -0
- package/src/install-mode.mjs +272 -0
- package/src/legacy-migration.d.ts +128 -0
- package/src/legacy-migration.mjs +510 -0
- package/src/lifecycle.mjs +338 -0
- package/src/local-proof.mjs +401 -0
- package/src/map-pin-writeback.mjs +210 -0
- package/src/orchestration-stage-contract.mjs +81 -0
- package/src/package-install-fixture.mjs +33 -0
- package/src/page-kit-build-summary.mjs +175 -0
- package/src/page-kit-campaign-config.mjs +57 -0
- package/src/page-kit-sdk-version.mjs +392 -0
- package/src/page-kit-store-profile.mjs +369 -0
- package/src/page-kit-sync.mjs +162 -0
- package/src/polish-browser.mjs +867 -0
- package/src/polish-capture.mjs +1094 -0
- package/src/polish-deadline.mjs +51 -0
- package/src/polish-gate.mjs +739 -0
- package/src/polish-node.mjs +639 -0
- package/src/polish-page-load.mjs +1100 -0
- package/src/private-template-source.mjs +237 -0
- package/src/proof-policy.mjs +82 -0
- package/src/qa-analytics-correctness.mjs +307 -0
- package/src/qa-analytics-errors.mjs +38 -0
- package/src/qa-analytics-parity.mjs +699 -0
- package/src/qa-binding-evidence.mjs +140 -0
- package/src/qa-browser.mjs +6608 -0
- package/src/qa-cart-entry.mjs +406 -0
- package/src/qa-commercial-parity.mjs +641 -0
- package/src/qa-node.mjs +3620 -0
- package/src/qa-order-bump.mjs +381 -0
- package/src/qa-parity-capture.mjs +428 -0
- package/src/qa-parity-fixture.mjs +359 -0
- package/src/qa-publish.mjs +362 -0
- package/src/qa-purchase-data-layer.mjs +263 -0
- package/src/qa-route-probe.mjs +272 -0
- package/src/qa-sidecar.mjs +188 -0
- package/src/qa-test-order-topology.mjs +207 -0
- package/src/qa-url-privacy.mjs +13 -0
- package/src/qa-verdict-discovery.mjs +192 -0
- package/src/qa-verdict-publish.mjs +105 -0
- package/src/qa-verdict.mjs +287 -0
- package/src/remit.mjs +388 -0
- package/src/repo-scan.mjs +83 -0
- package/src/route-identity.mjs +133 -0
- package/src/run-record-closeout.mjs +229 -0
- package/src/run-record.mjs +839 -0
- package/src/run-session.mjs +226 -0
- package/src/runtime-state-ignore.mjs +113 -0
- package/src/sdk-attribute-index.mjs +212 -0
- package/src/sdk-markup.mjs +358 -0
- package/src/sdk-meta-tags.mjs +52 -0
- package/src/shell-token.mjs +7 -0
- package/src/sidecar-bundle.mjs +399 -0
- package/src/source-asset-crawl.mjs +469 -0
- package/src/source-html-intake.mjs +627 -0
- package/src/source-html-manifest.mjs +276 -0
- package/src/source-prep.mjs +284 -0
- package/src/spec-derive-store.mjs +431 -0
- package/src/spec-derive.mjs +514 -0
- package/src/spec-fetch.mjs +66 -0
- package/src/spec-hash.mjs +48 -0
- package/src/spec-identity.mjs +27 -0
- package/src/stage-ledger.mjs +509 -0
- package/src/standardization-report.mjs +1297 -0
- package/src/template-brand-contract.mjs +473 -0
- package/src/template-freshness.mjs +196 -0
- package/src/template-reference.mjs +81 -0
- package/src/template-slot-manifest.mjs +150 -0
- package/src/text-safety.mjs +62 -0
- package/src/theme-gate.mjs +185 -0
- package/src/upsell-selector-scope.mjs +299 -0
package/AGENTS.md
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
# Campaigns OS — agent entry point
|
|
2
|
+
|
|
3
|
+
You are probably an agent, or the tooling in front of one, trying to answer a
|
|
4
|
+
single question: **is it safe to work against this commit of Campaigns OS, and
|
|
5
|
+
what changed since the commit I last reviewed?**
|
|
6
|
+
|
|
7
|
+
This file is the canonical answer. It tells you what to read, in what order,
|
|
8
|
+
which paths you may depend on, and how to orient without running anything from
|
|
9
|
+
this repository.
|
|
10
|
+
|
|
11
|
+
## The rule that shapes everything else
|
|
12
|
+
|
|
13
|
+
**Do not execute Campaigns OS code to decide whether to trust Campaigns OS.**
|
|
14
|
+
|
|
15
|
+
A target cannot supply its own trust decision. Everything you need to orient is
|
|
16
|
+
declarative data, readable straight out of Git objects at a resolved commit:
|
|
17
|
+
JSON contracts, a release ledger, a changelog, and JSON Schemas. No install, no
|
|
18
|
+
build, no checkout hooks, no CLI invocation. Reading a blob is safe; running a
|
|
19
|
+
script the target controls is not, however harmless the script looks.
|
|
20
|
+
|
|
21
|
+
`contracts/fixtures/orientation/hostile-target/` exists so you can prove your
|
|
22
|
+
reader honors this. It is a miniature target carrying Git hooks, an executable
|
|
23
|
+
script, and npm lifecycle scripts, each of which records a hit and exits 0. A
|
|
24
|
+
conforming orientation read of it produces a normal envelope and zero hits.
|
|
25
|
+
|
|
26
|
+
## Canonical reading order
|
|
27
|
+
|
|
28
|
+
Read these at one immutable commit OID. Resolve the OID once and use it for
|
|
29
|
+
every read, so nothing shifts under you mid-orientation.
|
|
30
|
+
|
|
31
|
+
| # | Path | What it answers |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| 1 | `contracts/supported-surface.json` | What may I depend on, and at what surface version? |
|
|
34
|
+
| 2 | `contracts/release-ledger.json` | What agent-relevant changes happened, in order? |
|
|
35
|
+
| 3 | `CHANGELOG.md` | The human narrative each ledger entry links to, one-to-one. |
|
|
36
|
+
| 4 | `contracts/orientation-limits.v1.json` | How much am I allowed to read before refusing? |
|
|
37
|
+
| 5 | `contracts/orientation-reason-codes.v1.json` | What may I report, and what is the remedy for each? |
|
|
38
|
+
| 6 | `schemas/campaigns-os-tooling-orientation.v1.schema.json` | The envelope shape I must produce. |
|
|
39
|
+
| 7 | `schemas/campaigns-os-release-ledger.v1.schema.json` | The ledger shape I am reading. |
|
|
40
|
+
| 8 | `contracts/agent-relevant-change-policy.v1.json` | What this repository counts as agent-relevant, and why a path was excluded. |
|
|
41
|
+
| 9 | `docs/orientation-contract-reference.md` | Every enum, reason code, remedy, bound, and a worked example per terminal outcome. |
|
|
42
|
+
|
|
43
|
+
Apply the limits from step 4 **before** you finish assembling. Exceeding one is
|
|
44
|
+
a refusal with reason code `orientation_too_large`. Never truncate: a partial
|
|
45
|
+
view of a release is worse than no view, because you cannot tell which part you
|
|
46
|
+
are missing.
|
|
47
|
+
|
|
48
|
+
Orienting on a commit tells you whether it is safe to work against. Turning that
|
|
49
|
+
commit into a runtime you can actually use is a separate question with its own
|
|
50
|
+
contract, and you only need it if you are preparing one:
|
|
51
|
+
|
|
52
|
+
| Path | What it answers |
|
|
53
|
+
|---|---|
|
|
54
|
+
| `contracts/runtime-recipe.campaigns-os-node-v1.json` | Exactly which commands prepare a runtime, under which tool versions, network policy, inputs, output checks, and bounds. |
|
|
55
|
+
| `schemas/campaigns-os-runtime-recipe.v1.schema.json` | The recipe shape, and which kinds, revisions, and safety-critical enums are accepted. |
|
|
56
|
+
| `docs/runtime-readiness.md` | The same contract in prose, generated from it. |
|
|
57
|
+
|
|
58
|
+
Execute the enumerated commands and nothing else; never assemble a command from
|
|
59
|
+
repository data. An unrecognized recipe kind, revision, or safety-critical enum
|
|
60
|
+
is a refusal, not a value to interpret. And a prepared runtime can build and
|
|
61
|
+
type-check but **cannot run browser QA** — preparation suppresses lifecycle
|
|
62
|
+
scripts, which is also what suppresses the browser download.
|
|
63
|
+
|
|
64
|
+
The recipe describes preparing a runtime from a **checkout**. The supported
|
|
65
|
+
way to *run* the toolkit without a checkout is as a **pinned devDependency of
|
|
66
|
+
the campaign folder** (a page-kit project): `npm i -D
|
|
67
|
+
"github:NextCommerceCo/campaigns-os#<sha>"` there, then `npx campaigns-os …`
|
|
68
|
+
from that folder. The same pin discipline applies — the sha is the one you
|
|
69
|
+
oriented on — and npm records the resolved commit in that folder's
|
|
70
|
+
`package.json` and `package-lock.json`, so CI and the deploy host install the
|
|
71
|
+
same commit and `tooling status` reads the pin back (`Install mode: package
|
|
72
|
+
install …`). It runs the package's own lifecycle script at install time, so it
|
|
73
|
+
is not a recipe execution and makes no claim under the recipe's output
|
|
74
|
+
checks. Every command the toolkit prints for you to copy is spelled for the
|
|
75
|
+
install it came from (`npx campaigns-os …` there). A recipe kind for package
|
|
76
|
+
installs is not published yet.
|
|
77
|
+
|
|
78
|
+
## Supported versus internal
|
|
79
|
+
|
|
80
|
+
`contracts/supported-surface.json` is the machine authority and
|
|
81
|
+
[`docs/supported-surface.md`](docs/supported-surface.md) is its prose twin.
|
|
82
|
+
|
|
83
|
+
- **Supported** — the `hashed{}` map, the `named[]` list, `cli_commands`,
|
|
84
|
+
`package_exports`, and `bin`. You may pin these, verify their bytes, and build
|
|
85
|
+
behavior on them. A change here is versioned, and it is loud.
|
|
86
|
+
- **Internal** — everything else: `src/**`, `scripts/**`, `examples/**`,
|
|
87
|
+
`prompts/**`, `agents/**`, and `contracts/**` other than the entries the
|
|
88
|
+
manifest names. Read them for context if you like. Never depend on them. A
|
|
89
|
+
consumer manifest that pins an internal path is invalid, and it will break
|
|
90
|
+
without notice or ceremony.
|
|
91
|
+
|
|
92
|
+
The orientation artifacts you consume are all on the supported surface: the
|
|
93
|
+
ledger, the three contract files, both schemas, the changelog, this file, the
|
|
94
|
+
generated reference, the authoring guide, and the fixtures under
|
|
95
|
+
`contracts/fixtures/orientation/envelope/` and
|
|
96
|
+
`contracts/fixtures/orientation/hostile-target/`.
|
|
97
|
+
|
|
98
|
+
Anything under `contracts/fixtures/` that the manifest does *not* name is this
|
|
99
|
+
repository's own test data. It is not yours to depend on.
|
|
100
|
+
|
|
101
|
+
## Releases are recorded twice, deliberately
|
|
102
|
+
|
|
103
|
+
`CHANGELOG.md` alone is not enough for you. It moves when the surface version
|
|
104
|
+
moves, and a great many changes that matter to an agent — a renamed CLI flag, a
|
|
105
|
+
rewritten contract doc, a new skill, a changed runtime input — leave the surface
|
|
106
|
+
version untouched.
|
|
107
|
+
|
|
108
|
+
So every agent-relevant change also gets a **release-ledger** entry, and the two
|
|
109
|
+
are checked against each other in both directions by
|
|
110
|
+
`scripts/check-release-ledger.mjs`:
|
|
111
|
+
|
|
112
|
+
1. Every agent-relevant changed path has exactly one ledger change item.
|
|
113
|
+
2. Every ledger change item maps to a classified change, or belongs to an
|
|
114
|
+
explicit reviewed amendment.
|
|
115
|
+
3. A supported-surface version change owes exactly one entry and one changelog
|
|
116
|
+
section.
|
|
117
|
+
4. History is append-only. A correction ships as a new amendment entry;
|
|
118
|
+
rewriting an old one fails CI.
|
|
119
|
+
|
|
120
|
+
Authoring rules and worked pass/fail examples:
|
|
121
|
+
[`docs/release-ledger-authoring-guide.md`](docs/release-ledger-authoring-guide.md).
|
|
122
|
+
|
|
123
|
+
### Ledger entries carry no commit, on purpose
|
|
124
|
+
|
|
125
|
+
An entry cannot name the commit that contains it without being rewritten after
|
|
126
|
+
that commit exists, which is exactly the after-the-fact editing the append-only
|
|
127
|
+
rule forbids. The schema rejects any commit-shaped property.
|
|
128
|
+
|
|
129
|
+
Derive the introducing commit yourself, from history at the target OID: walk the
|
|
130
|
+
commits that touched `contracts/release-ledger.json` oldest-first and credit each
|
|
131
|
+
entry id to the first commit whose ledger blob contains it. Merge commits need
|
|
132
|
+
no special case. If an entry arrived on a side branch, that commit is credited;
|
|
133
|
+
if it was first assembled while resolving a merge, the merge commit is. Both are
|
|
134
|
+
the truthful answer.
|
|
135
|
+
|
|
136
|
+
Two properties of that walk are load-bearing:
|
|
137
|
+
|
|
138
|
+
- **Walk the full history ending at the target**, not a slice starting at some
|
|
139
|
+
base. An entry introduced before your base was introduced outside the slice,
|
|
140
|
+
and a sliced walk either loses it or credits the slice's first ledger-touching
|
|
141
|
+
commit with introducing everything that already existed.
|
|
142
|
+
- **Disable history simplification** (`git rev-list --full-history --reverse
|
|
143
|
+
--topo-order <oid> -- contracts/release-ledger.json`). Git's default walk drops
|
|
144
|
+
commits that are TREESAME to a parent along the path, which can hide the
|
|
145
|
+
side-branch commit that actually introduced an entry and shift the credit to
|
|
146
|
+
the merge.
|
|
147
|
+
|
|
148
|
+
## Mixed versions and the legacy boundary
|
|
149
|
+
|
|
150
|
+
You and this repository are not upgraded at the same moment, so decide
|
|
151
|
+
explicitly rather than optimistically.
|
|
152
|
+
|
|
153
|
+
- **Unknown orientation schema id** — fail closed. Do not attempt a partial
|
|
154
|
+
parse of a contract you do not understand.
|
|
155
|
+
- **Unknown additive fields inside a recognized v1 schema** — accept and
|
|
156
|
+
preserve them without interpreting them. Every object in the orientation and
|
|
157
|
+
ledger schemas permits additional properties so an older consumer is not
|
|
158
|
+
stranded by producer-first rollout. This does not relax known semantics:
|
|
159
|
+
required fields, their declared types, and known safety-critical enums still
|
|
160
|
+
validate exactly. Additive data cannot grant authority or change the meaning
|
|
161
|
+
of a known field merely because it is present.
|
|
162
|
+
- **Unknown enum value in a safety-critical position** (a disposition, a reason
|
|
163
|
+
code, a compatibility result) — fail closed. Silently coercing an unrecognized
|
|
164
|
+
refusal into a success is the worst available outcome.
|
|
165
|
+
- **A commit with no orientation contract** — that commit predates this contract.
|
|
166
|
+
Report `orientation_contract_missing` and refuse, unless it is the exact
|
|
167
|
+
baseline your operator reviewed, in which case report `legacy_baseline` and
|
|
168
|
+
proceed only against the checkout that was already verified. Never fabricate a
|
|
169
|
+
`surface_version` for a commit that predates supported surfaces.
|
|
170
|
+
- **Target surface outside your accepted range** — `surface_incompatible`.
|
|
171
|
+
Upgrade yourself, or pin a reviewed baseline inside your range.
|
|
172
|
+
|
|
173
|
+
## The axes are independent
|
|
174
|
+
|
|
175
|
+
Report integrity, freshness, compatibility, runtime readiness, and orientation
|
|
176
|
+
separately. Collapsing them into one boolean is how a session ends up bound to a
|
|
177
|
+
checkout that is source-current and runtime-stale, or contract-compatible and
|
|
178
|
+
three releases behind.
|
|
179
|
+
|
|
180
|
+
The envelope keeps them apart by construction: `repository` and `request` carry
|
|
181
|
+
integrity, `freshness` carries currency, `surface` carries compatibility,
|
|
182
|
+
`runtime` carries generated-artifact readiness, and `release_ledger` plus
|
|
183
|
+
`changelog` carry orientation. `outcome` is the single terminal disposition you
|
|
184
|
+
reached, not a summary that overwrites the axes.
|
|
185
|
+
|
|
186
|
+
## Generated runtime
|
|
187
|
+
|
|
188
|
+
This repository builds `campaign-spec/dist` through its ordinary Node dependency
|
|
189
|
+
and build flow. Source freshness is **not** runtime readiness: a checkout can be
|
|
190
|
+
at the right commit with absent or stale generated output.
|
|
191
|
+
|
|
192
|
+
The `runtime` group is where you report that. Preparation happens in a fresh,
|
|
193
|
+
not-yet-active generation and never in place over a generation something is
|
|
194
|
+
already using. The declarative preparation recipe contract is a separate change
|
|
195
|
+
and is not published yet; until it is, `runtime.recipe_id` is `null` and you
|
|
196
|
+
determine readiness from the source fingerprint and the generated state.
|
|
197
|
+
|
|
198
|
+
## Human entry points
|
|
199
|
+
|
|
200
|
+
- [`README.md`](README.md) — what this toolkit is.
|
|
201
|
+
- [`CONTEXT.md`](CONTEXT.md) — the build flow in one page.
|
|
202
|
+
- [`docs/supported-surface.md`](docs/supported-surface.md) — the compatibility
|
|
203
|
+
promise, in prose.
|
|
204
|
+
- [`docs/versioning.md`](docs/versioning.md) — the independent version lines.
|