Support entitlements and SLA tracking, activated from a contract

Support coverage, cases and SLAs

People ask this as: support ticket SLA tracking tied to a customer contract

The pending service obligations of an activated contract become an operational Service Coverage with immutable entitlements, under a versioned policy that refuses to guess a support tier it cannot classify. Support cases run over an explicit five-state transition table with append-only activity, a first response stamped exactly once, and SLA evaluations that are elapsed wall-clock minutes with the inputs they used recorded alongside. It is not a contact centre and not a second contract: no customer is authenticated, no channel is connected, nothing escalates or notifies by itself, and a coverage amends nothing.

Where this stops

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

  • There is no customer portal and no customer account. Every case is recorded by an internal user actor on the customer's behalf; nobody outside can see, open or reply to anything.
  • No channel exists. There is no email, chat, WhatsApp or telephony adapter, no contact centre and no inbox — a channel named on an entitlement is a value in a record, not a connected provider.
  • The SLA clock is elapsed wall-clock minutes against an injected UTC clock. No business-hours calendar, no holiday table, no timezone interpretation, and waiting on the customer does not pause it.
  • Nothing escalates, routes, assigns or notifies by itself. Escalation is a record a human writes; no rule fires, no page is sent, nobody is woken up.
  • A Service Coverage is not a contract. Nobody signed it, it has no envelope, signer or artifact, and it neither amends nor replaces the Commercial Contract it was activated from.
  • Exceeding an entitlement limit is a refusal, not an overage charge. Nothing bills, invoices or establishes billing eligibility.
  • No attachments, no file storage, no knowledge base, no customer-success health scoring and no analytics over any of it.
  • The Admin section for this domain lives in the Admin app, not in the package, because no extension seam exists — the inspector publishes that gap as a machine-readable limitation rather than leaving it to be discovered.

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

A coverage moves planned to active to ended. Activating consumes the contract's pending service obligations and writes an immutable activation run naming which obligations were consumed under which policy version, plus one immutable entitlement per obligation saying what that obligation entitles the customer to — categories, priorities, channels, targets and limits.

A support case is recorded against an entitlement and moves over a declared table: new, in progress, waiting customer, resolved, closed. Case activity is append-only — notes, transitions, recorded replies and escalations. A first response is stamped exactly once. An SLA evaluation is an immutable judgement about an instant, storing the instant and the input values it used so it is never mistaken for current truth, and an escalation is an immutable record that a human escalated something.

Ten actions cover the path, and only two of them are readable by an agent: planning an activation, which writes nothing at all, and previewing an SLA. Every write requires a user actor.

The SLA contract, stated exactly

First response is due at the case opening plus the first-response target in minutes; resolution is due at the opening plus the resolution target. That is elapsed wall-clock time against an injected UTC clock, which is what makes a run reproducible.

There is no business-hours calendar, no holiday table, no timezone interpretation and no paused clock. Waiting on the customer does not stop it — not because pausing is wrong, but because a half-implemented pause understates a breach, and understating a breach is the one failure mode an SLA feature cannot have.

The Admin renders current SLA and recorded SLA as two separate blocks, and says on the screen that an SLA state here is elapsed wall-clock time rather than a contractual or legal determination. Previewing writes nothing.

What the framework refuses

An activation policy may answer ambiguous, and that is the interesting case: an obligation it cannot classify refuses activation until a human supplies an override with a stated reason, because a defaulted support tier is a promise nobody in the business made.

Entitlement is enforced server-side, not in the UI. An uncovered category, an uncovered priority, a coverage that is out of date or a full open-case limit is refused — and exceeding a limit bills nothing, because there is nothing to bill with. The Admin is state-aware in both directions: before activation it offers planning and nothing else, while any obligation is undecided there is no coverage form and no activation control at all, and after activation there is no second activation path. A case shows exactly the transitions the declared table allows for its current state, a first response is offered until it is stamped and never again, and a closed case shows no transition control and says why.

The screen carries the claims a reader would otherwise make on the framework's behalf: that a coverage is operational evidence and amends no commercial record, that a listed channel does not mean a provider is connected, that no notification was sent.

Why it is coverage and not a contract

Three shapes were compared before this was built. Hanging support off the Commercial Contract would mix a mutable operational lifecycle into a record whose entire value is that it does not move. A second legal ServiceContract would be a claim the framework cannot support: this repository has exactly one signature path, producing exactly one signed Order and one Commercial Contract, and a second contract nobody signed — with no envelope, no signer and no artifact — would invite the question which one is authoritative, which neither could answer.

The name is the trap. Anything called Contract here will be read as signed, so the concept is Service Coverage and the first paragraph of every document about it says what it is not.

How a coding agent builds it

Service is the third domain package and the second that depends on another. It declares one capability against the contracts package and imports nothing from that package's source and nothing from the kernel's. Removing the single static import removes the domain and everything else keeps working — including the capability contracts goes on providing to nobody.

The Admin section is package-scoped rather than package-owned, and this is published as a limitation rather than smoothed over: the framework has no seam for a package to contribute an Admin extension, so the file lives in the Admin app and renders only while the schema publishes the service domain. Remove the package and the section disappears instead of degrading into a broken control.

The activation policy is versioned and fingerprinted like every other policy in this framework: config is inside the fingerprint, versions are published rather than edited, and a recorded activation explains itself later without re-running anything.

Where it stops

An upgrade suite proves a project shipped before this package existed can adopt it over live obligations, and the starter runs the full journey from a pending obligation to a closed case with the commercial rows fingerprinted before and after. What it does not do is a long list, published in the schema and printed on the screen, and it starts with billing and ends with a scheduler.

Common questions

Is there a customer portal for support cases?

No. There is no customer account and no portal: every case is recorded by an internal user on the customer's behalf. Coverage, immutable entitlements and case transitions are real and tested; the customer-facing surface does not exist.

Are SLA breaches legally binding determinations?

No. SLA states are elapsed wall-clock time against the entitlement's targets — evidence, not a contractual judgement. The system records first response and resolution timing and keeps current versus recorded apart; nothing here adjudicates a contract.

Does escalation notify anyone automatically?

Escalation is recorded, not delivered: no notification channel or on-call rotation ships. Explicitly started workers can present service-SLA asks, but timers neither send notifications nor decide escalations.

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.
  • L-05 No email, calendar or marketing integrations. An in-memory notification provider contract exists. MK1 marketing records supplied funnel observations and human-reviewed proposals only; it has no sending, publishing or spending path.

Jobs it covers