Skip to content

§ 2.3 — Static manifest at a well-known URL for standard proposals (#29) - #76

Draft
Kishore-2572 wants to merge 1 commit into
mainfrom
spec/29-well-known-manifest
Draft

Kishore-2572 wants to merge 1 commit into
mainfrom
spec/29-well-known-manifest

Conversation

@Kishore-2572

Copy link
Copy Markdown

Draft. Do not merge until the working group confirms the disposition of #29.

What this changes

A new § 2.3 Publication lets a seller publish its public standard line items as a static file at https://<seller domain>/.well-known/openproposal.json, like ads.txt and sellers.json. The file carries seller_id, generated_at, spec_version and, per proposal, proposal_id, version, the Summary Representation (§ 2.1) of each line item, and a full_url. ETag / Last-Modified are required so buyers can poll cheaply; only line items with visibility: public appear; and entries must match the current version. Buyers discover from the manifest with no agent call or language model, then fetch the Full Representation of shortlisted line items and compose as today.

Related issue

Refs #29. The "current version" rule relies on #24 (draft PR #73).

Type

  • Editorial — no normative effect
  • Normative — changes what the spec requires
  • Breaking — would break an implementation already built to this draft
  • Examples / schema / docs only

Checklist

  • The body section is updated
  • Appendix A (field index) matches the body — no new rows, as § 2.3 has no field table; scripts/check_appendix.py passes
  • Appendix B (fields by marker, and the counts) matches the body — counts unchanged
  • Any affected example in examples/ is updated and still parses — new manifest.json (§ 6.5); visibility: public added to the CTV and audio examples so they can appear in it
  • RFC 2119 keywords used deliberately — MUST / SHOULD / MAY are not synonyms
  • The no-inheritance rule (§ 2) still holds
  • Anything selectable declares available[] and included[]; anything settable declares bounds (§ 3.1, § 3.2) — no new selectable or settable fields
  • No confidential or commercially sensitive content

Knock-on effects


By opening this pull request I agree my contribution may be published under this
repository's licence, as set out in CONTRIBUTING.md.

A new § 2.3 lets a seller publish its public standard line items at
/.well-known/openproposal.json: seller_id, generated_at, spec_version
and, per proposal, proposal_id, version, the Summary Representation of
each line item and a full_url. ETag / Last-Modified are required, only
line items with visibility public appear, and entries must match the
current version. Buyers discover from the manifest, then fetch the Full
Representation of shortlisted line items.

Adds examples/manifest.json (§ 6.5) and visibility: public to the CTV
and audio examples; the registry_gated display line item is not listed.

Refs #29
@KonstantinMirin

Copy link
Copy Markdown

Postindustria (IAB Tech Lab member). @Kishore-2572, examples/manifest.json carries the Summary Representation (§ 2.1), so it changes whenever another PR adds a summary key. Three open PRs do:

  • PR #70 (@Sirajmx) adds linked_execution to the proposal's summary keys and has_requires to each line item's. The manifest needs "linked_execution": "none" on the proposal and "has_requires": false on both entries.
  • Our PR for #90 adds environments.available[]: ["ctv"] on weather-app-ctv and ["web_mobile", "app_mobile"] on streaming-audio.
  • Our PR for #89 adds the placement keys a line item declares. The CTV example declares plcmt, so weather-app-ctv needs "placement": { "plcmt": 1 }, Instream (1).

Whichever PR merges later can add its keys to the manifest.

As your Knock-on effects note, the Examples parse check reads only examples/*.yaml. Adding examples/*.json would catch a broken edit, but not a missing key. Would a check that compares each manifest entry with its source example help, as check_appendix.py does for Appendix A?

Analyzed and generated with the help of Claude, fully reviewed by me.

@KonstantinMirin

Copy link
Copy Markdown

Postindustria (IAB Tech Lab member). @Kishore-2572, two points on § 2.3 and the example manifest:

  • Keep the body's shapes. formats keeps its { "included": [...] } object, but pricing becomes a single object, as § 2.1's pricing.cost_method path suggests, though § 5.6 defines pricing[] as an array. transaction_mechanism becomes a bare array, and § 3.1 treats a selectable field that carries a bare value as seller-set. Code screens this file, so one sentence in § 2.3 settles every key: "A summary uses the paths and shapes of the Full Representation, with fewer keys; property lists stay as names." Then § 2.1 reads pricing[].cost_method, pricing is [{ "cost_method": "CPM", "gross_rate": 45.0 }], and transaction_mechanism keeps available[] and included[].
  • Filter on status. As written, a public line item that is sold_out or withdrawn (§ 5.1) still qualifies. Suggest: "Only line items whose status is published appear."

Analyzed and generated with the help of Claude, fully reviewed by me.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants