Skip to content

Delivery evidence gaps for scheduled and offline channels: change cutoff, package installment selection, cinema and print proof #7777

Open

Description

@bokelley

Summary

A buyer that certifies sales agents on live delivery needs to confirm, for scheduled and offline channels, that a buy ran as ordered and that stops and changes took effect. AdCP 3.2 covers most of this:

Four gaps remain. We checked against 3.2.0-rc.7.

Gaps

  1. When a stop or change takes effect. installment.deadlines.cancellation_deadline is the last time to cancel without penalty. There is no field for the last time a cancellation, pause or creative change still takes effect: the traffic or log cutoff for broadcast, the posting cycle for OOH, the issue close for print, the reel lock for cinema. Without it, a buyer can't tell "the seller failed to stop" from "we asked after the cutoff".

    Proposal: an optional change_cutoff (datetime) on installment.deadlines, plus an optional product-level default lead time for products without installments.

  2. Selecting installments on a package. Installments are declared on the product, and delivery can be reported per installment, but a package request cannot say which installments it books: which episodes, airings, issues or posting periods.

    Proposal: an optional installments: installment-ref[] on the package request and the confirmed package.

  3. Cinema delivery evidence. There is no cinema metric block or settlement artifact, meaning the screening or attendance report by screen and week that exhibitors' ad networks issue.

    Proposal: a cinema_metrics block (screens, screenings, attendance with its source) and a screening record, following the ooh_metrics.postings pattern.

  4. Print insertion evidence. Per-installment delivery covers issue-level counts, but there is no insertion record. Industry practice is a tear sheet or affidavit per insertion.

    Proposal: an insertion record per installment (placement, page or section, tear-sheet reference), again following the postings pattern.

Why it matters

Without these, a buyer can only confirm that an offline order was accepted and that delivery reports arrived. It cannot confirm that the order ran as booked, or that a cancellation was honoured. Linear TV and radio are covered by by_spot in 3.2; the gaps above are what remain across scheduled and offline channels.

Activity

  1. added
    claude-triagingTriage routine is actively working on this issue (1-3 min)
    on Sep 30, 2026
  2. added this to the Spec Backlog milestone on Sep 30, 2026
  3. bokelley commented on Sep 30, 2026

    @bokelley
    ContributorAuthor

    Triage

    Outcome: Flag — four normative schema additions; WG ratification required before any implementation.
    Milestone: Spec Backlog
    Labels added: needs-wg-review · media-buy

    Protocol and product review complete. Expert findings are summarised below, followed by a decision memo (DR-0023) for WG consideration.


    Expert findings

    Gap Protocol verdict Product value WG action
    1 · change_cutoff on installment.deadlines SHIP — non-breaking optional field; no open design questions HIGH — agency accountability case is real across broadcast, OOH, print, cinema Ratify + assign spec author
    2 · Installment selection on package request FLAG — 3 design questions require WG resolution before spec can be drafted MEDIUM — real for serialized direct buys (podcasts, magazine runs, linear airings) Design session before brief
    3 · cinema_metrics block SHIP as x-status: experimental — direct parallel to ooh_metrics; available-metric.json needs token MEDIUM — niche but coherent; experimental posture matches OOH precedent Ratify + assign spec author
    4 · Print insertion record CLARIFY — 3 shape questions; low near-term adoption LOW — programmatic print not active; no current adopter blocking on this Defer to Spec Backlog; revisit if champion surfaces

    DR-0023 draft — for WG ratification

    id: DR-0023
    title: "Delivery evidence extensions for scheduled and offline channels"
    class: normative
    status: proposed
    date: 2026-09-30
    decided_by: pending WG ratification
    refs:
      - "https://github.com/adcontextprotocol/adcp/issues/7777"
      - "https://github.com/adcontextprotocol/adcp/issues/6140"

    Decision

    Add optional, non-breaking extensions to AdCP delivery-evidence schemas, in three tiers by readiness.

    Tier 1 — ready for spec brief (Gaps 1 and 3)

    • change_cutoff (string, format: date-time, optional) on installment-deadlines.json. Normative text must distinguish: broadcast log/traffic cutoff, OOH posting-cycle lock, print issue close, cinema reel-lock date. Distinct from cancellation_deadline (penalty-free cancel window) and booking_deadline (new-booking window); it governs whether a mid-flight change or stop still takes effect operationally.

    • cinema_metrics block on delivery-metrics.json, x-status: experimental, mirroring the ooh_metrics precedent. Minimum properties: screens (integer, contracted), screenings ({scheduled, actual} integer counts), attendance ({modeled, source} — source enum: ticketing_data | exhibitor_report | modeled). Per-screening record parallel to ooh_metrics.postings[].{panel_id, occurred_at, evidence}. Add cinema_metrics token to available-metric.json enum.

    Tier 2 — needs WG design session before brief (Gap 2)

    • Optional installment_selection: installment-ref[] on package-request.json; echo field on the confirmed package object. Three questions the WG must resolve before spec is drafted:
      1. Hard-filter vs. preference semantics — what error code path when seller cannot honour the selection (PRODUCT_UNAVAILABLE vs. INVALID_REQUEST)?
      2. Whether a seller capability advertisement is required (targeting_overlay interaction or standalone capability flag)?
      3. Confirmed-package echo field shape — does it repeat the selection or reflect what was actually honoured?

    Tier 3 — deferred, no committed release (Gap 4)

    Print insertion record: deferred to Spec Backlog until: (a) WG resolves placement — delivery-metrics.json block (parallel to ooh_metrics) vs. extension of installment-delivery-metrics.json (more coherent — one insertion = one installment); (b) page/section field — free strings now vs. closed enum (SRDS/PIB position taxonomy); (c) WG affirms that placement-evidence.json (url, content_digest, capture metadata) satisfies legal tear-sheet/affidavit use cases.

    Rationale

    All four proposals are non-breaking: optional fields on schemas with additionalProperties: true, new optional blocks, new enum tokens. Tiers 1 proposals follow directly established patterns with no open design questions. Tier 2 has semantics ambiguity that would produce incompatible implementations if left open. Tier 3 has low near-term adopter value; no active programmatic print channel has surfaced a blocking need.

    Implications

    • Tier 1 changes are minor changeset class, targeting main (3.2.0-rc.N or 3.3.0); not backportable to 3.1.x.
    • Tier 2 requires a WG design session; @bokelley or a WG volunteer should own the design brief.
    • sort-metric.json enum extension for cinema_metrics breakdowns is deferred to the implementing PR author.
    • Gap 4 stays in Spec Backlog; a cinema-channel or print-channel champion should request re-evaluation when adoption case emerges.

    Wire sketches

    Gap 1 — installment.deadlines with change_cutoff added:

    {
      "booking_deadline": "2026-11-01T18:00:00Z",
      "cancellation_deadline": "2026-11-07T18:00:00Z",
      "change_cutoff": "2026-11-10T18:00:00Z",
      "material_deadlines": [
        { "stage": "draft", "due_at": "2026-10-15T18:00:00Z" },
        { "stage": "final", "due_at": "2026-10-22T18:00:00Z" }
      ]
    }

    Gap 2 — Package request with installment_selection (shape pending WG resolution):

    {
      "product_id": "pod-morning-run-s3",
      "installment_selection": [
        {
          "collection_ref": { "publisher_id": "npr", "collection_id": "mr-s3" },
          "installment_id": "ep-03"
        },
        {
          "collection_ref": { "publisher_id": "npr", "collection_id": "mr-s3" },
          "installment_id": "ep-04"
        }
      ]
    }

    Gap 3 — cinema_metrics delivery response excerpt:

    {
      "cinema_metrics": {
        "screens": 450,
        "screenings": { "scheduled": 3150, "actual": 3087 },
        "attendance": { "modeled": 412000, "source": "ticketing_data" },
        "screenings_detail": [
          {
            "screen_id": "ncm-la-0042",
            "occurred_at": "2026-10-04T19:45:00-07:00",
            "creative_id": "cr-trailer-a",
            "evidence": { "url": "https://...", "content_digest": "sha256:..." }
          }
        ]
      }
    }

    Triage · 2026-09-30 · Claude Code


    Generated by Claude Code

  4. added
    claude-triagedIssue has been triaged by the Claude Code triage routine. Remove to re-triage.
    needs-wg-reviewBlocked on a working-group decision — surface in WG meeting agendas
    media-buyIssue concerns the media-buy protocol domain
    and removed
    claude-triagingTriage routine is actively working on this issue (1-3 min)
    on Sep 30, 2026
  5. modified the milestones: Spec Backlog, 3.3.0 on Oct 8, 2026
  6. bokelley commented on Oct 30, 2026

    @bokelley
    ContributorAuthor

    A fifth gap: live event sponsorship evidence

    The same problem shows up for live events, and it fits this issue's pattern.

    What already works. Taxonomy v1.1.0 places event sponsorship under product_placement ("Event sponsorships", "Naming rights"), the fee prices as flat_rate, and an installment can represent the event date. A seller can describe and sell the sponsorship today.

    What's missing is proof that it delivered. There is no delivery shape for:

    • Attendance. Forecast, registered and attended counts, and where the attended number comes from (ticketing, badge scans, door count). Attendance is to an event what audience impressions are to static OOH: the currency the sponsorship was priced on.
    • Contracted deliverables. A sponsorship is a bundle of promises: a stage mention, the logo on signage and the agenda, a hosted session, a booth. A buyer needs to see each one marked delivered or missed, with an evidence reference such as a photo or recording.

    Without these, a buyer can't tell whether a sponsorship delivered. Nor can it settle the make-good when attendance misses forecast, which is the most common dispute.

    Proposal. An experimental event_metrics block, following ooh_metrics.postings and the cinema_metrics proposal above:

    • per installment (event date): forecast_attendance, registered, attended, and attendance_source;
    • a deliverables[] fulfilment record whose items reference deliverable IDs declared on the product, each with status and an evidence_ref.

    Out of scope: attendee lists and lead sharing. They involve personal data and belong under governance and consent, not delivery metrics. Ads that run at an event (venue screens, for example) keep their own channel, as the taxonomy already says.

    Where we hit it. We're building a simulated market in which a fictional publisher, Northstar Journal, runs one conference a quarter. Its sponsors ask for money back when registrations come in under forecast. We currently have to carry attendance in an ext object, and this issue is the upstream path we'd point to.

    This looks Normative and experimental, and could ride the same decision memo as gaps 3 and 4.

  7. bokelley commented on Oct 31, 2026

    @bokelley
    ContributorAuthor

    Part of this shipped: gap 1, change_cutoff on installment deadlines, in #8054 (3.3.0-beta.0).

    Gap 2, installment selection on packages, was merged in #8246 but withdrawn to 4.0 by #8537 (3.3.0-beta.2) under the closed commercial-terms decision (#8501); it is in the 4.0 work list there. Gaps 3 to 5 (cinema metrics, print insertion record, event metrics) have no PR and no decision, so per the WG rule ('anything not decided moves to 3.4') only the remainder moves to 3.4. Objections by Fri 2026-11-06. The milestone stays 3.3.0 for now; it will be moved after Nov 6.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    claude-triagedIssue has been triaged by the Claude Code triage routine. Remove to re-triage.media-buyIssue concerns the media-buy protocol domainneeds-wg-reviewBlocked on a working-group decision — surface in WG meeting agendas

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions