Turning a signed order into a contract and a subscription

Contract and subscription activation

People ask this as: activate a subscription and contract from a signed order

A signed immutable Order activates through versioned policy and a human decision into a Contract, immutable version, Subscription and pending delivery/service obligations. Terms frozen into the signed quote document retain signed-order provenance; legacy orders without signed terms can use explicitly labelled post-signature operational metadata. Operational dates are never promoted to signed terms. Governed renewal and amendment execution creates a successor agreement from its own signed Order, with immutable lineage and a derived line delta. Historical contracts and subscriptions are not edited. There is no automatic renewal, cancellation execution, billing or customer notification.

Where this stops

Read this before the rest of the page. Every line below is a thing this does not do.

  • Nothing bills. There is no invoice, no payment, no usage rating, no proration and no dunning, and the contract package does not pretend otherwise.
  • Terms frozen into the signed quote document retain signed-order provenance; legacy orders without signed terms can use explicitly labelled post-signature operational metadata. Operational dates are never promoted to signed terms.
  • Contract autoRenew and notice-period metadata do not execute a renewal or send a notice. Durable jobs, a transactional outbox and scheduled asks exist for self-hosted applications that explicitly start a worker. Nothing autostarts; a timer opens an ask, never makes a decision, and no managed worker service or recurrence is included (L-04).
  • Governed renewal and amendment execution creates a successor agreement from its own signed Order, with immutable lineage and a derived line delta. Historical contracts and subscriptions are not edited. There is no automatic renewal, cancellation execution, billing or customer notification. A human can record non-renewal intent with a reason; that is not cancellation execution.
  • MRR, ARR and TCV are not calculated from contract data, and no expansion or contraction is classified at the time of change.
  • A Subscription here is a commercial activation record — what was sold as a recurring right, per period, copied from the Order. Nothing consumes it, meters it or invoices it.
  • A pending delivery or service obligation is a recorded fact, not a queued job. Nothing executes it and nothing activates it until a human, in a later domain, chooses to.

No authentication ships: the framework authenticates nobody. Production Spine v1 (ADR-038) gives the framework verified identity, organizations and memberships, server-authoritative authorization and one tenant per application instance — so tenancy and authorization now exist and are enforced. What does not exist is authentication: no login, password, session or OIDC implementation ships, and a deployment must supply the adapter that verifies the request. Production mode refuses to start without one. In local-development mode an actor header is accepted as an assertion and is not an identity, which is the default developer posture. This is not shared-database multi-tenancy and it is not a readiness claim. Every claim and every limitation is on one page.

What it models

plan-activation is read-only and safe for an agent: it reports what activation would create and writes nothing at all — no domain record, no business audit, no event. activate-contract then does everything in one transaction: the activation run, the contract, its immutable version, one line per order component, the subscription and its lines, and one pending delivery or service obligation per component that owes something beyond the money.

Identity is enforced by the database rather than by a check-then-write, so two concurrent activations — in one application or across two connections — produce exactly one contract. The Order is never modified; activation only sets its managed contract link. And the contract reads independently forever after: deactivate every offer, rewrite live component prices, publish a new catalog revision, rename the customer, and the contract and its lines do not move, because every value was copied from the Order and the customer name came from the Order's own party snapshot.

Recurrence is not a classification

The tempting rule — recurring becomes a subscription, one-time becomes delivery — is wrong in a way that silently mis-files real money. Annual premium support is recurring money and future service work at the same time; a single exclusive label has to drop one of them, and the first implementation dropped the subscription line, removing real recurring revenue from the Subscription.

So the policy answers two independent questions per component. The commercial axis returns subscription, non_subscription or ambiguous; the obligations axis returns any combination of delivery and service, an explicit empty list, or ambiguous. Every order component still becomes exactly one contract line whatever the answers are, and no obligation type is ever created twice for one component.

An empty obligations list is a decision. ambiguous is the absence of one, and it blocks activation until a human resolves that one axis of that one component with a stated reason. The single coherence rule the domain enforces regardless of policy or override: a subscription line must recur, so overriding a one-time charge into a subscription is 409 CLASSIFICATION_INCOHERENT — recording a one-time fee as a recurring right would put a false amount into every future recurring figure.

What the framework refuses

Only a user actor may activate; an agent is 403 HUMAN_APPROVAL_REQUIRED. A plan is not an authorization token — activation recomputes the whole classification inside the transaction from the Order, so a plan that looked activatable a minute ago does not make an activation succeed unless the same decisions are supplied again.

The client never supplies amounts or source hashes. Signed Order terms are copied with their provenance; only the legacy operational-term path accepts human-entered dates and a required reason. Policy classification and human overrides remain explicit.

Activation refuses anything it cannot prove, each with a stable code: an order that is not accepted, an order with no completed signature evidence, an envelope, artifact and order that do not belong together, a disagreement on the signed document hash, a snapshot missing lines, components or totals, an order already activated, and a term that ended before the activation.

A policy that returns a Promise, an unknown type, an unbounded reason or that throws is a 500 and nothing is activated. Dates are validated by round-trip, so 2026-02-30 and 2026-13-01 are refused rather than normalized into a different day; autoRenew must be a strict boolean and a notice period requires it, because a notice against a renewal that cannot happen is a clause that can never apply.

How a coding agent builds it

This is the first domain built outside the kernel. Everything lives in an optional package: remove the single static import that registers it and the domain disappears while the kernel, the API, the SDK and every earlier milestone behave identically. The kernel gained one generic registry seam, one generic input type and an injectable clock, and a test scans the core sources and the static import graph to prove no contract, subscription or obligation concept entered it.

The activation policy is a versioned fingerprinted definition that decides from the component key, the SKU and the offer identity the Order already recorded — never from label text and never from recurrence alone. Its context is a deep-frozen structural clone of the Order snapshot, so a policy cannot mutate what it is classifying and never sees the live catalog. Config is inside the fingerprint, versions are published rather than edited, and v2 is how a decision changes while v1's historical activation still explains itself.

Both answers survive on the contract line: what the policy said, what applies, whether it was overridden, the override reason and who overrode it, on both axes. An activation is explainable years later without re-running anything.

Where it stops

Schema, plans and Admin retain explicit domain limitations. Activation itself does not bill or schedule renewal. Lifecycle can execute a governed successor from independently signed evidence; it never changes historical contract rows.

Common questions

Does contract activation start billing?

No. Activation turns a signed Order into a Commercial Contract, an immutable contract version, a Subscription and pending obligations — and stops there. There is no invoice, no payment, no usage rating, no proration and no renewal automation.

Can a contract be activated without a human?

No. Activation runs through a versioned policy and one recorded human decision. An ambiguous plan blocks until a person decides it, and the tests assert an agent cannot stand in for that decision.

What happens to the contract if the package is removed?

The domain is optional and detaches cleanly: the kernel fingerprint is unchanged with the package absent, and a database written before removal boots again with its rows intact when the package returns. That boundary is held by tests, not convention.

The evidence this page rests on

Claims and limitations are printed from site/claims.json word for word. Job statuses come from docs/benchmarks/jobs.json; a job with no page of its own is listed with its status rather than linked.

Claims

  • C-10 A signed Order activates into a Commercial Contract, an immutable contract version, a Subscription and explicitly pending delivery and service obligations — every component classified, never guessed.

    LimitTerms frozen into the signed quote document retain signed-order provenance; legacy orders without signed terms can use explicitly labelled post-signature operational metadata. Operational dates are never promoted to signed terms. Governed renewal and amendment execution creates a successor agreement from its own signed Order, with immutable lineage and a derived line delta. Historical contracts and subscriptions are not edited. There is no automatic renewal, cancellation execution, billing or customer notification.

  • C-16 Every mutation goes through a module service or a named workflow, and leaves an audit event and a step-level trace behind it.

    LimitAudit records what the process did under an asserted actor. It is not a tamper-evident or externally attestable log, and it is not a compliance control.

Limitations

  • L-01 No authentication ships: the framework authenticates nobody. Production Spine v1 (ADR-038) gives the framework verified identity, organizations and memberships, server-authoritative authorization and one tenant per application instance — so tenancy and authorization now exist and are enforced. What does not exist is authentication: no login, password, session or OIDC implementation ships, and a deployment must supply the adapter that verifies the request. Production mode refuses to start without one. In local-development mode an actor header is accepted as an assertion and is not an identity, which is the default developer posture. This is not shared-database multi-tenancy and it is not a readiness claim.
  • L-04 Timers exist; a service that runs them for you does not. Durable jobs, a transactional outbox and scheduled asks exist for self-hosted applications that explicitly start a worker. Nothing autostarts; a timer opens an ask, never makes a decision, and no managed worker service or recurrence is included.

Jobs it covers