Skip to content

Worked examples

The rest of this section explains the contract model field by field. This page does the opposite: it starts from situations Packt actually meets — signing an author, licensing a title to a partner, widening a deal by addendum, renegotiating with an estate, resolving two deals that disagree — and shows the contract each one produces.

Every scenario follows the same shape. A short plain-English story sets the scene, a table or diagram summarises the terms that matter, and the full contract record sits in a collapsed block for anyone who wants to copy it. You can read every story straight through without ever opening the JSON.

Two ideas from Works & rights recur throughout, so they are worth restating once. First, a Contract attaches to a Work — the intellectual-property anchor — never to an individual document or file; the rights it grants are resolved on the Work and projected onto every Resource beneath it. Second, only inbound contracts (rights flowing in from an author or rights holder) contribute to what the platform holds; outbound contracts (rights flowing out to a distributor or partner) are checked against those held rights and never widen them.

The rights model in one line

Rights are held once on the Work, cached per Resource, and revalidated at the point of use against the contract versions pinned in each Resource's rights_basis. Every example below is a variation on that single idea.

Money in the JSON is in integer micros (1,000,000 micros = 1.00 of the stated currency) and rates are in basis points (rate_bps: 2500 = 25%). IDs use readable slugs in place of the random suffix.

1. A standard author deal

Priya Chandra writes Hands-On Machine Learning with Go. She grants Packt worldwide rights to publish it, in every language, as an ebook and in print — but keeps audiobook rights back for a separate deal she is still negotiating. She is paid a royalty: 25% of net receipts on ebooks, 10% on everything else, every quarter. This is the everyday shape of Packt's list, and it is an inbound contract — the author is granting rights to the platform.

The three grant axes each do one job. Territory opens the whole world. Manifestation says which sellable embodiments may be produced — ebook and print yes, audiobook explicitly no — so the moment anyone tries to build an audiobook Product from this Work, the rights check denies it, with no extra configuration anywhere downstream. Royalty prices each sale by its most specific matching rule.

Axis Term Effect
Territory worldwide: PERMITTED Sellable everywhere
Manifestation EBOOK permitted, PRINT permitted Ebook + print editions allowed
Manifestation AUDIOBOOK prohibited No audiobook may be produced
Royalty EBOOK 2500 bps · default 1000 bps 25% ebook, 10% everything else
Usage ACCESS, DISPLAY permitted; TRANSLATE prohibited Read/display yes; no translation without a separate deal
Duration 3-year term, auto-renew 12 months Renews unless notice is served
flowchart TD
    C["Author agreement<br/>ctr_chandra_2026 · INBOUND"] --> W["Work<br/>wk_ml_go"]
    W --> P1["Ebook · PERMITTED"]
    W --> P2["Print · PERMITTED"]
    W --> X1["Audiobook · PROHIBITED"]
    W --> R1["Resource · Chapter 1"]
    W --> R2["Resource · Chapter 3"]

The audiobook prohibition is the interesting bit. Because it is set once on the Work, it governs every Resource, Expression, and Product built from Hands-On Machine Learning with Go automatically — nobody has to remember it, and nobody downstream can quietly override it.

Contract — standard author deal (JSON)
{
  "id": "ctr_chandra_2026",
  "title": "Author Agreement — Hands-On Machine Learning with Go",
  "status": "ACTIVE",
  "direction": "INBOUND",
  "version": 1,
  "agents": [
    { "agent_id": "agt_chandra", "role": "AUTHOR", "name": "P. Chandra" },
    { "agent_id": "agt_packt", "role": "PUBLISHER", "name": "Packt Publishing" }
  ],
  "work_ids": ["wk_ml_go"],
  "territorial_rights": [
    { "worldwide": true, "status": "PERMITTED" }
  ],
  "manifestation_rights": [
    { "manifestation_type": "EBOOK", "status": "PERMITTED" },
    { "manifestation_type": "PRINT", "status": "PERMITTED" },
    { "manifestation_type": "AUDIOBOOK", "status": "PROHIBITED" }
  ],
  "royalty": {
    "type": "ROYALTY",
    "currency": "GBP",
    "basis": "NET_RECEIPTS",
    "rates": [
      { "rate_bps": 1000 },
      { "manifestation_type": "EBOOK", "rate_bps": 2500 }
    ],
    "payment_frequency": "QUARTERLY"
  },
  "usage_terms": [
    {
      "usage_type": "ACCESS",
      "status": "PERMITTED",
      "user_types": ["INDIVIDUAL", "INSTITUTIONAL"]
    },
    { "usage_type": "DISPLAY", "status": "PERMITTED" },
    { "usage_type": "TRANSLATE", "status": "PROHIBITED" }
  ],
  "duration": {
    "effective_date": "2026-01-01T00:00:00Z",
    "expiry_date": "2029-01-01T00:00:00Z",
    "auto_renew_months": 12,
    "notice_period_days": 90
  }
}

2. A distributor grant

Packt already holds the rights above, and now wants to sell the same Work through O'Reilly's learning platform. That is an outbound contract: Packt grants onward a slice of what it holds. The slice is deliberately narrow — ebook only, US and UK only, streamed to O'Reilly's own subscribers — with attribution required on every use and a named channel rule that Distribution will match against later.

Two things make outbound different from inbound. It never widens the Work's rights: reading the Work still shows only Priya's inbound grant. And it is validated at activation against the resolved inbound rights — Packt cannot grant O'Reilly a territory, manifestation, or usage it does not itself hold. Try to add audiobook here and activation fails, because the inbound deal prohibits audiobook.

Axis Term Effect
Direction OUTBOUND Grants rights Packt already holds; never widens them
Territory US, GB permitted Distribution limited to two markets
Manifestation EBOOK permitted Ebook only
Usage MAKE_AVAILABLE (stream), DISTRIBUTE Hosted for O'Reilly's subscribers
Handling ATTRIBUTION required Credit Packt + author on every use
Channel oreilly-learning · US/GB · EBOOK Matched by Distribution before content ships
flowchart LR
    W["Work · wk_ml_go<br/>inbound rights held"] -->|checked at activation| O["Distributor grant<br/>ctr_oreilly_ml_go · OUTBOUND"]
    O --> CH["Channel<br/>O'Reilly Learning · US/GB · ebook"]
    O -.->|never widens| W

MAKE_AVAILABLE vs DISTRIBUTE

O'Reilly hosts the content for its own subscribers without passing copies onward — that is MAKE_AVAILABLE. DISTRIBUTE covers the case where copies pass to a recipient who then holds them (a download store, a bundle). Naming the right verb is what lets Distribution match this grant to the right kind of channel.

Contract — distributor grant (JSON)
{
  "id": "ctr_oreilly_ml_go",
  "title": "O'Reilly Distribution — Hands-On Machine Learning with Go",
  "status": "ACTIVE",
  "direction": "OUTBOUND",
  "version": 1,
  "agents": [
    { "agent_id": "agt_packt", "role": "PUBLISHER", "name": "Packt Publishing" },
    {
      "agent_id": "agt_oreilly",
      "role": "DISTRIBUTOR",
      "name": "O'Reilly Media",
      "email": "partners@oreilly.com"
    }
  ],
  "work_ids": ["wk_ml_go"],
  "territorial_rights": [
    { "territory_codes": ["US", "GB"], "status": "PERMITTED" }
  ],
  "manifestation_rights": [
    { "manifestation_type": "EBOOK", "status": "PERMITTED" }
  ],
  "usage_terms": [
    {
      "usage_type": "MAKE_AVAILABLE",
      "status": "PERMITTED",
      "user_types": ["INDIVIDUAL", "INSTITUTIONAL"],
      "method": "VIEW_ONLINE",
      "territory_codes": ["US", "GB"]
    },
    {
      "usage_type": "DISTRIBUTE",
      "status": "PERMITTED",
      "purpose": "COMMERCIAL"
    }
  ],
  "handling_terms": [
    {
      "handling_type": "ATTRIBUTION",
      "status": "REQUIRED",
      "exception": "Attribute Packt and the author on every use"
    }
  ],
  "channel_rules": [
    {
      "channel_id": "oreilly-learning",
      "channel_name": "O'Reilly Learning",
      "territory_codes": ["US", "GB"],
      "permitted_manifestation_types": ["EBOOK"],
      "category_codes": ["COM051000"],
      "status": "PERMITTED"
    }
  ],
  "royalty": {
    "type": "ROYALTY",
    "currency": "USD",
    "rates": [{ "rate_bps": 2500 }],
    "payment_frequency": "MONTHLY"
  },
  "duration": {
    "effective_date": "2026-02-01T00:00:00Z",
    "expiry_date": "2028-02-01T00:00:00Z",
    "auto_renew_months": 12
  }
}

Channel matching is in design

The channel_rules block records the intended channel entitlement, but the matchmaking that evaluates it — pairing a channel's declared usage against these terms before any content ships — is a Phase 2 capability. See Channels.

3. An addendum amending territory

A year in, the author deal is doing well and Packt wants to sell into Australia and Canada too. Priya signs a one-page addendum widening the territory. The important thing is what the platform does not do: it does not edit the original contract in place. Instead the addendum produces a new version — version 2 — that carries the full amended term set, while version 1 is preserved exactly as signed. The history is never lost.

Publishing version 2 emits a rights_changed event. The Content Lake hears it, re-resolves the Work's rights, and rewrites the projection on every Resource beneath it — the reprojection ripple described in Works & rights. Nobody sweeps the catalogue by hand; the two new markets simply start resolving as permitted on the next query.

flowchart LR
    V1["Version 1<br/>US, GB permitted"] -->|addendum signed| V2["Version 2<br/>US, GB, AU, CA permitted"]
    V2 -->|rights_changed| CL["Content Lake<br/>reprojects the Work"]
    CL --> IDX["Search index +<br/>Resource projections updated"]
Version 1 (as signed) Version 2 (after addendum)
Territory codes US, GB US, GB, AU, CA
Preserved? Yes — immutable Yes — immutable
Event on write created version_created, rights_changed

Every version is kept, on purpose

Browse-tier reads use the latest active version for speed. Consequential actions — publishing, shipping, serving to an AI surface — revalidate against the exact contract version pinned in each Resource's rights_basis, so an audit can always answer "on what basis, in which version, was this allowed?" years later.

Territory term — before and after the addendum (JSON)

Version 1, as originally signed:

{
  "id": "ctr_chandra_2026",
  "version": 1,
  "territorial_rights": [
    { "territory_codes": ["US", "GB"], "status": "PERMITTED" }
  ]
}

Version 2, after the addendum — the whole amended term set is submitted and stored as a new immutable snapshot; the source reference traces the change back to the addendum clause:

{
  "id": "ctr_chandra_2026",
  "version": 2,
  "territorial_rights": [
    {
      "territory_codes": ["US", "GB", "AU", "CA"],
      "status": "PERMITTED",
      "source": {
        "document_id": "srcdoc_chandra_addendum_1",
        "clause": "1.1"
      }
    }
  ]
}

4. A succession window — two contracts on one Work

An author's fixed-term agreement is running out, and the renegotiated replacement is not signed yet. For a few weeks the Work sits under two contracts at once: the old agreement, now EXPIRED but carrying a continuing-access window so existing subscribers keep their ebook access, and the new agreement, freshly ACTIVE. This is the classic succession shape, and it is exactly why a Work can be governed by more than one contract.

The merge behaviour is what matters. Between the old deal's expiry and the new deal's effective date, only the expired contract contributes — and only its continuing-access terms, so existing ebook entitlements stay served and nothing else resolves. Once the new agreement takes effect, it contributes its full terms; the two windows overlap briefly, and during that overlap a Resource's rights_basis pins both contracts — one entry each.

gantt
    dateFormat YYYY-MM-DD
    axisFormat %b
    title Two contracts across the succession window
    section Old agreement (EXPIRED)
    In force            :done, 2023-01-01, 2026-01-01
    Continuing access   :active, 2026-01-01, 2026-05-01
    section New agreement (ACTIVE)
    In force            :2026-04-01, 2029-04-01
Window Old agreement contributes New agreement contributes rights_basis pins
Before Jan 2026 Full terms Old only
Jan–Apr 2026 Continuing access only (ebook) Old only
Apr–May 2026 (overlap) Continuing access only (ebook) Full terms Both
After May 2026 Full terms New only

Continuing access narrows, never widens

An expired contract can only ever contribute less than it did in force. The continuing-access window restricts manifestations to the listed classes (here, ebook only) and to entitlements that existed before the contract ended — it never grants anything new. The moment that window closes, the expired contract drops out of resolution entirely.

The Work's rights during the overlap (JSON)

Both contracts appear in the Work's contracts list. The expired one contributes only its continuing-access terms; the active one contributes its full terms.

{
  "id": "wk_python_data",
  "rights": {
    "contracts": [
      {
        "id": "ctr_devi_2023",
        "status": "EXPIRED",
        "version": 4,
        "duration": {
          "effective_date": "2023-01-01T00:00:00Z",
          "expiry_date": "2026-01-01T00:00:00Z",
          "continuing_access": {
            "post_cancellation_access": true,
            "access_period_days": 120,
            "permitted_manifestation_types": ["EBOOK"],
            "description": "Existing subscribers keep ebook access during renegotiation"
          }
        }
      },
      {
        "id": "ctr_devi_2026",
        "status": "ACTIVE",
        "version": 1,
        "duration": {
          "effective_date": "2026-04-01T00:00:00Z",
          "expiry_date": "2029-04-01T00:00:00Z",
          "auto_renew_months": 12,
          "notice_period_days": 90
        }
      }
    ]
  }
}

A Resource under the Work during the overlap pins both:

{
  "id": "res_python_data_ch1",
  "work_id": "wk_python_data",
  "usable": true,
  "rights_basis": [
    { "contract_id": "ctr_devi_2023", "contract_version": 4 },
    { "contract_id": "ctr_devi_2026", "contract_version": 1 }
  ]
}

5. A rights conflict — prohibition wins

Two inbound contracts govern one Work and they disagree. The author agreement permits worldwide distribution. A separately acquired rights-holder agreement — perhaps covering a third-party asset embedded in the title — prohibits distribution in the European Union pending a compliance review. What does the Work resolve to?

The rule is simple and absolute: where grants overlap, prohibition wins. The platform unions the permitted grants, then subtracts every prohibited one. So the Work resolves to distributable everywhere except the EU — the EU prohibition beats the worldwide permit precisely where they overlap, and leaves the rest of the worldwide permit intact. The precedence order is PROHIBITED > CONDITIONAL > PERMITTED.

flowchart TD
    A["Author agreement<br/>worldwide · PERMITTED"] --> M{"Resolution<br/>on the Work"}
    B["Rights-holder agreement<br/>EU · PROHIBITED"] --> M
    M --> R["Resolved rights<br/>worldwide EXCEPT the EU"]
Grant Coverage Status
Author agreement Worldwide PERMITTED
Rights-holder agreement EU member states PROHIBITED
Resolved on the Work Everywhere except the EU

The same precedence settles a usage disagreement identically: if one contract permits AI_TRAINING and another prohibits it, the resolved verdict is prohibited. A prohibition can never be cancelled by another contract's permission or silence — that is what makes the model safe to build enforcement on.

Silence denies, too

Conflict resolution is not the only way a use ends up denied. If no term covers a requested use, the answer is also denial — the platform never infers a permission from absence. A permission has to be granted explicitly; a prohibition, once present, wins.

The two conflicting grants and the resolved result (JSON)

Author agreement — worldwide distribution permitted:

{
  "id": "ctr_okafor_2026",
  "direction": "INBOUND",
  "territorial_rights": [
    { "worldwide": true, "status": "PERMITTED" }
  ]
}

Rights-holder agreement on the same Work — EU prohibited, authored with the platform EU territory set (expanded and pinned at write time, so later membership changes cannot silently alter it):

{
  "id": "ctr_dataco_2026",
  "direction": "INBOUND",
  "territorial_rights": [
    {
      "territory_sets": [
        {
          "set": "EU",
          "pinned_codes": [
            "AT", "BE", "BG", "HR", "CY", "CZ", "DK", "EE", "FI",
            "FR", "DE", "GR", "HU", "IE", "IT", "LV", "LT", "LU",
            "MT", "NL", "PL", "PT", "RO", "SK", "SI", "ES", "SE"
          ]
        }
      ],
      "status": "PROHIBITED"
    }
  ]
}

Resolved territorial rights on wk_okafor_secure — the union minus the prohibition:

{
  "id": "wk_okafor_secure",
  "rights": {
    "contracts": [
      { "id": "ctr_okafor_2026", "status": "ACTIVE", "version": 1 },
      { "id": "ctr_dataco_2026", "status": "ACTIVE", "version": 1 }
    ],
    "territorial_rights": [
      { "worldwide": true, "status": "PERMITTED" },
      {
        "territory_sets": [{ "set": "EU" }],
        "status": "PROHIBITED"
      }
    ]
  }
}

Where to go next

These five cover the everyday shapes. When the question is "can the model hold this clause?", go to Complete examples — three deliberately maximal records distilled from Packt's real contract archive, with a lookup table from real-world clause to schema field. When you need a specific corner of the model, reach for the field reference in the Contract model.