Repository navigation
Description
Summary
#8525 asked you to name the constrained scalars the bundle repeats — a pattern, a
format, a bound — and it landed. This is the same ask one layer up, over object shapes.
Measured over the 1,054 portable documents of bundle 3.2 (adcp_version 3.2.4): the bundle
states 95 distinct object shapes at more than one position in more than one document, and
gives none of them a title anywhere — 255 positions in 131 documents.
A shape here is the set of property names plus required plus additionalProperties plus
every narrowing keyword — everything that changes which instances are admitted, and nothing
that does not. Two positions are one shape exactly when no payload can tell them apart.
Nothing in this ask changes what any document accepts. title is an annotation.
The set, by positions descending
| positions | documents | the bundle's own word at those sites | the field set, * = required |
one site |
|---|---|---|---|---|
| 10 | 8 | total_budget |
amount*, currency* |
governance/check-governance-request.json#/properties/proposed_commitment |
| 10 | 8 | reporting_period |
end*, start* |
core/reporting-adjustment.json#/properties/accounting_period |
| 7 | 7 | location |
field |
core/assets/daast-asset.json#/oneOf/0/properties/macro_declarations/items/properties/location |
| 7 | 7 | macro_declarations[] |
location |
core/assets/daast-asset.json#/oneOf/0/properties/macro_declarations/items |
| 6 | 4 | inputs[] |
context_description, macros, name* |
core/creative-asset.json#/properties/inputs/items |
| 5 | 5 | — none | context, errors*, ext |
content-standards/calibrate-content-response.json#/oneOf/1 |
| 5 | 5 | location |
lat*, lng* |
core/destination-item.json#/properties/location |
| 5 | 4 | provider |
domain* |
core/reporting-dataset-share-destination.json#/oneOf/1/properties/provider |
| 4 | 4 | period |
end*, source_timezone*, start* |
core/reporting-consumer-status.json#/properties/period |
| 4 | 4 | range |
max*, min* |
core/signal-listing.json#/properties/range |
| 4 | 4 | — none | metric_id*, qualifier, scope* |
core/missing-metric.json#/oneOf/0 |
| 4 | 4 | identifiers[] |
type*, value* |
core/canonical-placement.json#/properties/identifiers/items |
| 4 | 3 | identifiers[] |
type*, value* |
collection/base-collection-source.json#/oneOf/0/properties/identifiers/items |
| 4 | 2 | — none | language, type*, value* |
content-standards/create-content-standards-request.json#/properties/calibration_exemplars/properties/pass/items/oneOf/0 |
| 3 | 3 | accessibility |
alt_text, keyboard_navigable, motion_control, screen_reader_tested |
core/assets/html-asset.json#/properties/accessibility |
| 3 | 3 | credit_limit |
amount*, currency* |
account/sync-accounts-response.json#/oneOf/0/properties/accounts/items/properties/credit_limit |
| 3 | 3 | amount |
amount*, currency* |
governance/get-plan-audit-logs-response.json#/properties/plans/items/properties/entries/items/properties/amount |
| 3 | 3 | address |
city, country, postal_code, region, street |
core/hotel-item.json#/properties/address |
| 3 | 3 | geometry |
coordinates*, type* |
core/catchment.json#/properties/geometry |
| 3 | 3 | authentication |
credentials*, schemes* |
core/push-notification-config.json#/properties/authentication |
| 3 | 3 | pagination |
cursor, max_results |
collection/get-collection-list-request.json#/properties/pagination |
| 3 | 3 | — none | metric_id*, qualifier, scope*, vendor* |
core/missing-metric.json#/oneOf/1 |
| 3 | 3 | — none | status |
media-buy/accept-proposal-request.json#/properties/opportunity/allOf/1 |
| 3 | 3 | travel_time |
unit*, value* |
core/catchment.json#/properties/travel_time |
| 3 | 3 | radius |
unit*, value* |
core/catchment.json#/properties/radius |
That is the top 25. The remaining 70 are each at 2 positions in 2 documents; the whole set with
every (document, pointer) member is below under The full set.
Of the 95: 80 have two or more properties and 44 have three or more, so this is not a tail of
one-field wrappers. 76 of the 95 are reached through the same property name at every one of
their positions — the third column. That column is evidence, not a proposal: it is the word
your own documents already use at those sites.
We checked whether this is our bug first, and it is not
The one distinction that decides whose problem a repeated shape is:
- if the bundle writes a
$reffrom one occurrence to another, the shape is stated once and
a generator that emits two types has failed to follow the reference — our defect; - if the occurrences are distinct nodes with no reference joining them, the shape is stated
twice and there is nothing for a generator to follow — an ask.
Resolving every $ref in the bundle against every member of every one of these 95 groups:
0 of 95 are joined by a reference. All 95 are restatements. We also checked the
neighbouring case — a shape stated at two document roots because the same file ships at two
paths — and that is 0 of the 95 too.
What it costs a consumer
A generator can only name a type from something the document says. Where the document says
nothing, the name has to come from the position, so one shape becomes one type per position,
each named after wherever it happened to be found. Those 255 positions emit 224 classes
in our Python SDK: 59 of the 95 shapes get one name repeated at every position, 28 get between
two and eight different names, and 8 emit no class of their own because every occurrence is an
allOf conjunct folded into its parent.
The monetary amount, {amount, currency}, at 10 positions:
governance.check_governance_request.ProposedCommitment
governance.check_governance_request.ExecutionCommitment
media_buy.accept_proposal_request.TotalBudget
media_buy.buy_products_request.TotalBudget
media_buy.change_term_constraints.Money # <- the one place you already name it
media_buy.commercial_terms.TotalBudget
media_buy.control_media_buy_request.TotalBudget
media_buy.create_media_buy_request.TotalBudget
media_buy.update_media_buy_request.TotalBudgetNine classes, four names, for one shape. And the fifth line is the point: the bundle already
has a word for this. media-buy/change-term-constraints.json writes it at
#/definitions/money, so a generator picks up Money there and nowhere else. The other eight
sites restate the two properties inline and get named after the property that happens to hold
them.
The reporting window, {start, end}, at 10 positions is the widest — eight distinct names for
one shape:
AccountingPeriod · ReportingPeriod · ReportingReliabilityMeasurementPeriod · Flight ·
Period · DeliveryStatementReportingPeriod · EntriesItemDeliveryReportingPeriod ·
GovernedActionsItemDeliveryReportingPeriod
A buyer who reads a reporting_period out of a governance response cannot pass it to a
media_buy call, because the two are different classes with identical fields. That is not a
defect we can repair locally: collapsing them would mean picking one of the eight names and
applying it to the other seven subjects, and no document authorises that choice. So the SDK
emits all eight, and the duplication a consumer meets is a faithful rendering of the bundle.
The ask
Give each of these 95 shapes a title, the same string at every occurrence. That is the
whole of it. One keyword, no restructuring, no new documents, no change to any $ref.
"reporting_period": {
"type": "object",
+ "title": "Reporting Period",
"required": ["start", "end"],
"properties": { "start": {...}, "end": {...} }
}A shared title is sufficient because it is what tells a shared subject from a coincidental
overlap. Two objects with the same fields are not automatically one concept — {value, unit}
under radius and under travel_time may genuinely be two — and a generator has no business
deciding. A title decides it, and then one named type serves every position.
Any string you choose answers this. We are not asking you to adopt a vocabulary; we are
asking for the one you already have, written down at the nodes that share it. If you would
rather extract a shape to its own titled document and $ref it — #8525's form — that answers
it more strongly and we would prefer it, but it is strictly more work and title alone is
enough.
Where two occurrences really are different subjects, titling them differently also answers
the ask: it says so explicitly, and the ambiguity is what costs us, not the duplication.
Already filed as instances of this
Each of these is one family out of the 95, reported separately before the pattern was measured:
- A money value is declared inline 21 times in seven incompatible shapes, and no document names it #8471 — a money value inline 21 times in seven incompatible shapes, and no document names it
- Failed-response envelope {context, errors, ext} has 12 spellings across 26 documents; 5 omit errors.minItems #8516 — the failed-response envelope in 12 spellings across 26 documents
({context, errors, ext}, row 6 above) - core: four inline copies of identifier.json disagree with it on additionalProperties #8301 — four inline copies of
identifier.jsonthat disagree with it - The country→postal-system registry is stated in seven places that must be hand-synced, because its schema form is not generator-consumable #8122 — the country→postal-system registry stated in seven places
The full set
The full set — all 95 shapes, every (document, pointer) member
1. 10 positions, 8 documents {amount*, currency*} [total_budget]
governance/check-governance-request.json#/properties/proposed_commitment
governance/check-governance-request.json#/properties/execution_commitment
media-buy/accept-proposal-request.json#/properties/total_budget
media-buy/buy-products-request.json#/properties/total_budget
media-buy/change-term-constraints.json#/definitions/money
media-buy/commercial-terms.json#/properties/total_budget
media-buy/commercial-terms.json#/properties/cancellation_terms/properties/fee
media-buy/control-media-buy-request.json#/properties/total_budget
media-buy/create-media-buy-request.json#/properties/total_budget
media-buy/update-media-buy-request.json#/properties/total_budget
2. 10 positions, 8 documents {end*, start*} [reporting_period]
core/reporting-adjustment.json#/properties/accounting_period
core/reporting-reliability-statistics.json#/definitions/ReportingReliabilityMeasurementPeriod
governance/check-governance-request.json#/properties/delivery_metrics/properties/reporting_period
governance/check-governance-response.json#/properties/delivery_statement/properties/reporting_period
governance/get-plan-audit-logs-response.json#/properties/plans/items/properties/entries/items/properties/delivery_statement/properties/reporting_period
governance/get-plan-audit-logs-response.json#/properties/plans/items/properties/entries/items/properties/delivery/properties/reporting_period
governance/get-plan-audit-logs-response.json#/properties/plans/items/properties/governed_actions/items/properties/delivery_reporting_period
governance/report-plan-outcome-request.json#/properties/delivery/properties/reporting_period
governance/sync-plans-request.json#/properties/plans/items/properties/flight
media-buy/get-reporting-status-request.json#/properties/period
3. 7 positions, 7 documents {field} [location]
core/assets/daast-asset.json#/oneOf/0/properties/macro_declarations/items/properties/location
core/assets/daast-tracker-asset.json#/properties/macro_declarations/items/allOf/1/properties/location
core/assets/display-tag-asset.json#/oneOf/0/properties/macro_declarations/items/allOf/1/properties/location
core/assets/pixel-tracker-asset.json#/properties/macro_declarations/items/allOf/1/properties/location
core/assets/url-asset.json#/properties/macro_declarations/items/allOf/1/properties/location
core/assets/vast-asset.json#/oneOf/0/properties/macro_declarations/items/properties/location
core/assets/vast-tracker-asset.json#/properties/macro_declarations/items/allOf/1/properties/location
4. 7 positions, 7 documents {location} [macro_declarations/Item]
core/assets/daast-asset.json#/oneOf/0/properties/macro_declarations/items
core/assets/daast-tracker-asset.json#/properties/macro_declarations/items/allOf/1
core/assets/display-tag-asset.json#/oneOf/0/properties/macro_declarations/items/allOf/1
core/assets/pixel-tracker-asset.json#/properties/macro_declarations/items/allOf/1
core/assets/url-asset.json#/properties/macro_declarations/items/allOf/1
core/assets/vast-asset.json#/oneOf/0/properties/macro_declarations/items
core/assets/vast-tracker-asset.json#/properties/macro_declarations/items/allOf/1
5. 6 positions, 4 documents {context_description, macros, name*} [inputs/Item]
core/creative-asset.json#/properties/inputs/items
creative/preview-creative-request.json#/properties/inputs/items
creative/preview-creative-request.json#/properties/requests/items/properties/inputs/items
media-buy/build-creative-request.json#/properties/preview_inputs/items
media-buy/build-creative-response.json#/oneOf/0/properties/preview/properties/previews/items/properties/input
media-buy/build-creative-response.json#/oneOf/1/properties/preview/properties/previews/items/properties/input
6. 5 positions, 5 documents {context, errors*, ext} [(no shared property name)]
content-standards/calibrate-content-response.json#/oneOf/1
content-standards/get-content-standards-response.json#/oneOf/1
content-standards/get-media-buy-artifacts-response.json#/oneOf/1
content-standards/list-content-standards-response.json#/oneOf/1
content-standards/validate-content-delivery-response.json#/oneOf/1
7. 5 positions, 5 documents {lat*, lng*} [location]
core/destination-item.json#/properties/location
core/hotel-item.json#/properties/location
core/real-estate-item.json#/properties/location
core/store-item.json#/properties/location
core/vehicle-item.json#/properties/location
8. 5 positions, 4 documents {domain*} [provider]
core/reporting-dataset-share-destination.json#/oneOf/1/properties/provider
core/reporting-delivery-offering.json#/properties/method/properties/provider
core/reporting-delivery-offering.json#/properties/method/properties/producer_identity/properties/provider
core/reporting-report-definition.json#/properties/source/properties/provider
core/reporting-write-destination.json#/oneOf/1/properties/provider
9. 4 positions, 4 documents {end*, source_timezone*, start*} [period]
core/reporting-consumer-status.json#/properties/period
core/reporting-file-manifest.json#/properties/period
core/reporting-obligation.json#/properties/period
core/reporting-revision.json#/properties/period
10. 4 positions, 4 documents {max*, min*} [range]
core/signal-listing.json#/properties/range
core/wholesale-feed-event.json#/$defs/signal/properties/range
property/property-feature-definition.json#/properties/range
signals/get-signals-response.json#/properties/signals/items/properties/range
11. 4 positions, 4 documents {metric_id*, qualifier, scope*} [(no shared property name)]
core/missing-metric.json#/oneOf/0
core/performance-feedback-metric.json#/oneOf/0
core/performance-feedback.json#/properties/metric/oneOf/0
media-buy/package-request.json#/properties/committed_metrics/items/oneOf/0
12. 4 positions, 4 documents {type*, value*} [identifiers/Item]
core/canonical-placement.json#/properties/identifiers/items
core/placement-definition.json#/properties/identifiers/items
core/placement.json#/properties/identifiers/items
core/property.json#/properties/identifiers/items
13. 4 positions, 3 documents {type*, value*} [identifiers/Item]
collection/base-collection-source.json#/oneOf/0/properties/identifiers/items
collection/collection-list-filters.json#/properties/exclude_distribution_ids/items
collection/get-collection-list-response.json#/properties/collections/items/properties/distribution_ids/items
collection/get-collection-list-response.json#/properties/coverage_gaps/additionalProperties/items
14. 4 positions, 2 documents {language, type*, value*} [(no shared property name)]
content-standards/create-content-standards-request.json#/properties/calibration_exemplars/properties/pass/items/oneOf/0
content-standards/create-content-standards-request.json#/properties/calibration_exemplars/properties/fail/items/oneOf/0
content-standards/update-content-standards-request.json#/properties/calibration_exemplars/properties/pass/items/oneOf/0
content-standards/update-content-standards-request.json#/properties/calibration_exemplars/properties/fail/items/oneOf/0
15. 3 positions, 3 documents {alt_text, keyboard_navigable, motion_control, screen_reader_tested} [accessibility]
core/assets/html-asset.json#/properties/accessibility
core/assets/javascript-asset.json#/properties/accessibility
core/assets/zip-asset.json#/properties/accessibility
16. 3 positions, 3 documents {amount*, currency*} [credit_limit]
account/sync-accounts-response.json#/oneOf/0/properties/accounts/items/properties/credit_limit
compliance/comply-test-controller-request.json#/properties/params/properties/reported_spend
core/account.json#/properties/credit_limit
17. 3 positions, 3 documents {amount*, currency*} [amount]
governance/get-plan-audit-logs-response.json#/properties/plans/items/properties/entries/items/properties/amount
governance/report-plan-adjustment-request.json#/properties/amount
governance/report-plan-adjustment-response.json#/properties/amount
18. 3 positions, 3 documents {city, country, postal_code, region, street} [address]
core/hotel-item.json#/properties/address
core/real-estate-item.json#/properties/address
core/store-item.json#/properties/address
19. 3 positions, 3 documents {coordinates*, type*} [geometry]
core/catchment.json#/properties/geometry
core/product-filters.json#/properties/geo_proximity/items/properties/geometry
core/targeting.json#/properties/geo_proximity/items/properties/geometry
20. 3 positions, 3 documents {credentials*, schemes*} [authentication]
core/push-notification-config.json#/properties/authentication
core/reporting-webhook.json#/properties/authentication
media-buy/create-media-buy-request.json#/properties/artifact_webhook/properties/authentication
21. 3 positions, 3 documents {cursor, max_results} [pagination]
collection/get-collection-list-request.json#/properties/pagination
content-standards/get-media-buy-artifacts-request.json#/properties/pagination
property/get-property-list-request.json#/properties/pagination
22. 3 positions, 3 documents {metric_id*, qualifier, scope*, vendor*} [(no shared property name)]
core/missing-metric.json#/oneOf/1
core/performance-feedback-metric.json#/oneOf/1
core/performance-feedback.json#/properties/metric/oneOf/1
23. 3 positions, 3 documents {status} [(no shared property name)]
media-buy/accept-proposal-request.json#/properties/opportunity/allOf/1
media-buy/buy-products-request.json#/properties/opportunity/allOf/1
media-buy/create-media-buy-request.json#/properties/opportunity/allOf/1
24. 3 positions, 3 documents {unit*, value*} [travel_time]
core/catchment.json#/properties/travel_time
core/product-filters.json#/properties/geo_proximity/items/properties/travel_time
core/targeting.json#/properties/geo_proximity/items/properties/travel_time
25. 3 positions, 3 documents {unit*, value*} [radius]
core/catchment.json#/properties/radius
core/product-filters.json#/properties/geo_proximity/items/properties/radius
core/targeting.json#/properties/geo_proximity/items/properties/radius
26. 3 positions, 2 documents {agent_url*, feature_id} [verify_agent]
core/evaluator-spec.json#/properties/feature_agent
core/provenance.json#/properties/embedded_provenance/items/properties/verify_agent
core/provenance.json#/properties/watermarks/items/properties/verify_agent
27. 3 positions, 2 documents {canceled_at*, canceled_by*, reason} [cancellation]
core/media-buy.json#/properties/cancellation
media-buy/get-media-buys-response.json#/properties/media_buys/items/properties/cancellation
media-buy/get-media-buys-response.json#/properties/media_buys/items/properties/packages/items/properties/cancellation
28. 3 positions, 2 documents {high, low, mid} [(no shared property name)]
core/forecast-point.json#/properties/metrics/properties/coverage_rate/allOf/1
core/forecast-point.json#/properties/viewability/properties/viewable_rate/allOf/1
core/forecast-rate-range.json#/allOf/1
29. 2 positions, 2 documents {action, ask, product_id*, scope*} [(no shared property name)]
media-buy/get-products-request.json#/properties/refine/items/oneOf/1
media-buy/product-refinement.json#/items/oneOf/1
30. 2 positions, 2 documents {action, ask, proposal_id*, scope*} [(no shared property name)]
media-buy/get-products-request.json#/properties/refine/items/oneOf/2
media-buy/product-refinement.json#/items/oneOf/2
31. 2 positions, 2 documents {agent_name, agent_url*, capabilities} [creative_agents/Item]
creative/list-creative-formats-response.json#/properties/creative_agents/items
media-buy/list-creative-formats-response.json#/properties/creative_agents/items
32. 2 positions, 2 documents {agent_url*, context_match, identity_match} [providers/Item]
core/product-filters.json#/properties/trusted_match/properties/providers/items
core/product-offer-filters.json#/properties/trusted_match/properties/providers/items
33. 2 positions, 2 documents {agent_url*} [buyer_agent]
core/audience-activation-method.json#/oneOf/1/properties/buyer_agent
core/product-filters.json#/properties/audience_activation_methods/items/oneOf/1/properties/buyer_agent
34. 2 positions, 2 documents {ai_act_risk_class*, disclosure, method*, seed_source*, training_data_jurisdictions*} [modeling]
core/signal-definition-enrichment.json#/properties/modeling
core/signal-definition.json#/properties/modeling
35. 2 positions, 2 documents {all_values*} [(no shared property name)]
core/geo-region-requirement.json#/properties/countries/additionalProperties/anyOf/0
core/geo-region-support.json#/properties/countries/additionalProperties/anyOf/0
36. 2 positions, 2 documents {ask*, scope*} [(no shared property name)]
media-buy/get-products-request.json#/properties/refine/items/oneOf/0
media-buy/product-refinement.json#/items/oneOf/0
37. 2 positions, 2 documents {attestation_reference_digest, category_id*, confidence, details, explanation*, policy_id, severity*, source_plan_id, uncertainty_reason} [findings/Item]
governance/check-governance-response.json#/properties/findings/items
governance/get-plan-audit-logs-response.json#/properties/plans/items/properties/entries/items/properties/findings/items
38. 2 positions, 2 documents {brand*, type*} [issuer]
core/rights-attestation-evaluation.json#/properties/reference/allOf/1/properties/issuer
core/rights-constraint.json#/properties/attestation_refs/items/allOf/1/properties/issuer
39. 2 positions, 2 documents {brand_id, sku_id} [brand_context]
content-standards/get-media-buy-artifacts-response.json#/oneOf/0/properties/artifacts/items/properties/brand_context
content-standards/validate-content-delivery-request.json#/properties/records/items/properties/brand_context
40. 2 positions, 2 documents {canonical_payload*, cumulative_spend*, currency*, issued_at*, reporting_period*, seller_reference*, sequence*, statement_digest*, statement_id*} [delivery_statement]
governance/check-governance-response.json#/properties/delivery_statement
governance/get-plan-audit-logs-response.json#/properties/plans/items/properties/entries/items/properties/delivery_statement
41. 2 positions, 2 documents {ccpa_opt_out_url, channels*, response_sla_days, upstream_source_domain} [data_subject_rights]
core/signal-definition-enrichment.json#/properties/data_subject_rights
core/signal-definition.json#/properties/data_subject_rights
42. 2 positions, 2 documents {claim_type, issuer, subject} [(no shared property name)]
core/rights-attestation-evaluation.json#/properties/reference/allOf/1
core/rights-constraint.json#/properties/attestation_refs/items/allOf/1
43. 2 positions, 2 documents {claimant_says, observed_at, parent_domain*} [claim]
brand/verify-brand-claim-request.json#/oneOf/1/properties/claim
brand/verify-brand-claims-request.json#/definitions/claim_entry/oneOf/1/properties/claim
44. 2 positions, 2 documents {code*, details, message*} [error]
core/tasks-get-response.json#/properties/error
protocol/get-task-status-response.json#/properties/error
45. 2 positions, 2 documents {code*, system*} [metros/Item]
core/product-filters.json#/properties/metros/items
core/product-offer-filters.json#/properties/metros/items
46. 2 positions, 2 documents {completed_at, created_at*, domain*, has_webhook, status*, task_id*, task_type*, updated_at*} [tasks/Item]
core/tasks-list-response.json#/properties/tasks/items
protocol/list-tasks-response.json#/properties/tasks/items
47. 2 positions, 2 documents {confidence, explanation, feature_id*, policy_id, status*} [features/Item]
content-standards/calibrate-content-response.json#/oneOf/0/properties/features/items
content-standards/validate-content-delivery-response.json#/oneOf/0/properties/results/items/properties/features/items
48. 2 positions, 2 documents {content*, delivery_type*, macro_declarations} [(no shared property name)]
core/assets/daast-asset.json#/oneOf/1
core/assets/vast-asset.json#/oneOf/1
49. 2 positions, 2 documents {context_contains, created_after, created_before, has_webhook, protocol, protocols, status, statuses, task_ids, task_type, task_types, updated_after, updated_before} [filters]
core/tasks-list-request.json#/properties/filters
protocol/list-tasks-request.json#/properties/filters
50. 2 positions, 2 documents {countries, email, languages, rights*, url} [channels/Item]
core/signal-definition-enrichment.json#/properties/data_subject_rights/properties/channels/items
core/signal-definition.json#/properties/data_subject_rights/properties/channels/items
51. 2 positions, 2 documents {countries, mark*, number, registry, use_case} [claim]
brand/verify-brand-claim-request.json#/oneOf/3/properties/claim
brand/verify-brand-claims-request.json#/definitions/claim_entry/oneOf/3/properties/claim
52. 2 positions, 2 documents {creative, media-buy, signals} [domain_breakdown]
core/tasks-list-response.json#/properties/query_summary/properties/domain_breakdown
protocol/list-tasks-response.json#/properties/query_summary/properties/domain_breakdown
53. 2 positions, 2 documents {credential_fingerprint, mode*} [delivery_auth]
core/agent-webhook-challenge.json#/properties/delivery_auth
core/webhook-challenge.json#/properties/delivery_auth
54. 2 positions, 2 documents {credentials, schemes*} [authentication]
core/agent-notification-config.json#/properties/authentication
core/notification-config.json#/properties/authentication
55. 2 positions, 2 documents {current_step, percentage, step_number, total_steps} [progress]
core/tasks-get-response.json#/properties/progress
protocol/get-task-status-response.json#/properties/progress
56. 2 positions, 2 documents {data*, timestamp*, type*} [history/Item]
core/tasks-get-response.json#/properties/history/items
protocol/get-task-status-response.json#/properties/history/items
57. 2 positions, 2 documents {delivery_metrics*, seller_reference*} [canonical_payload]
governance/check-governance-response.json#/properties/delivery_statement/properties/canonical_payload
governance/get-plan-audit-logs-response.json#/properties/plans/items/properties/entries/items/properties/delivery_statement/properties/canonical_payload
58. 2 positions, 2 documents {delivery_type*, macro_declarations, url*} [(no shared property name)]
core/assets/daast-asset.json#/oneOf/0
core/assets/vast-asset.json#/oneOf/0
59. 2 positions, 2 documents {description, population_id*, system*, version*} [baseline]
core/audience-evidence.json#/properties/baseline
core/canonical-audience-evidence.json#/properties/baseline
60. 2 positions, 2 documents {direction, field} [sort]
core/tasks-list-request.json#/properties/sort
protocol/list-tasks-request.json#/properties/sort
61. 2 positions, 2 documents {direction*, field*} [sort_applied]
core/tasks-list-response.json#/properties/query_summary/properties/sort_applied
protocol/list-tasks-response.json#/properties/query_summary/properties/sort_applied
62. 2 positions, 2 documents {domain*, name*} [house]
brand/get-brand-identity-response.json#/oneOf/0/properties/house
brand/search-brands-response.json#/definitions/SearchBrandResult/properties/house
63. 2 positions, 2 documents {domain_breakdown, filters_applied, returned, sort_applied, status_breakdown, total_matching} [query_summary]
core/tasks-list-response.json#/properties/query_summary
protocol/list-tasks-response.json#/properties/query_summary
64. 2 positions, 2 documents {effective_rate} [(no shared property name)]
media-buy/get-media-buy-delivery-response.json#/properties/media_buy_deliveries/items/properties/totals/allOf/1
media-buy/media-buy-delivery-webhook-result.json#/properties/media_buy_deliveries/items/properties/totals/allOf/1
65. 2 positions, 2 documents {email, languages, url} [data_subject_contestation]
brand.json#/definitions/data_subject_contestation
core/brand-ref.json#/properties/data_subject_contestation
66. 2 positions, 2 documents {end*, start*, timezone} [reporting_period]
media-buy/get-media-buy-delivery-response.json#/properties/reporting_period
media-buy/media-buy-delivery-webhook-result.json#/properties/reporting_period
67. 2 positions, 2 documents {etag, parent_match_behavior, ref*, segtax, value_mappings, values*, version} [taxonomy]
core/signal-definition-enrichment.json#/properties/taxonomy
core/signal-definition.json#/properties/taxonomy
68. 2 positions, 2 documents {expires_at, message*, url} [setup]
account/sync-accounts-response.json#/oneOf/0/properties/accounts/items/properties/setup
core/account.json#/properties/setup
69. 2 positions, 2 documents {fail, pass} [calibration_exemplars]
content-standards/content-standards.json#/properties/calibration_exemplars
core/evaluator-spec.json#/oneOf/0/properties/exemplars
70. 2 positions, 2 documents {fail, pass} [calibration_exemplars]
content-standards/create-content-standards-request.json#/properties/calibration_exemplars
content-standards/update-content-standards-request.json#/properties/calibration_exemplars
71. 2 positions, 2 documents {field} [location]
core/assets/daast-asset.json#/oneOf/1/properties/macro_declarations/items/properties/location
core/assets/vast-asset.json#/oneOf/1/properties/macro_declarations/items/properties/location
72. 2 positions, 2 documents {id*, modifiers, path} [values/Item]
core/signal-definition-enrichment.json#/properties/taxonomy/properties/values/items
core/signal-definition.json#/properties/taxonomy/properties/values/items
73. 2 positions, 2 documents {identifier*, region, store, type*} [property]
brand/verify-brand-claim-request.json#/oneOf/2/properties/claim/properties/property
brand/verify-brand-claims-request.json#/definitions/claim_entry/oneOf/2/properties/claim/properties/property
74. 2 positions, 2 documents {indicator_types_evaluated, indicators} [(no shared property name)]
creative/list-creatives-response.json#/properties/creatives/items/properties/assignments/properties/assigned_packages/items/allOf/1
media-buy/get-media-buys-response.json#/properties/media_buys/items/properties/packages/items/properties/creative_approvals/items/allOf/1
75. 2 positions, 2 documents {key*, value*} [targeting_kvs/Item]
trusted-match/context-match-response.json#/definitions/targeting_kvs/items
trusted-match/provider-context-match-response.json#/definitions/targeting_kvs/items
76. 2 positions, 2 documents {kind*, period} [reach_window]
compliance/comply-test-controller-request.json#/properties/params/properties/reach_window
core/delivery-metrics.json#/properties/reach_window
77. 2 positions, 2 documents {language_range*, locale_variant_id*} [locale_fallbacks/Item]
core/creative-localization-readback.json#/properties/locale_fallbacks/items
core/creative-localization.json#/properties/locale_fallbacks/items
78. 2 positions, 2 documents {location} [macro_declarations/Item]
core/assets/daast-asset.json#/oneOf/1/properties/macro_declarations/items
core/assets/vast-asset.json#/oneOf/1/properties/macro_declarations/items
79. 2 positions, 2 documents {match_keys*, pre_onboarding_audience_expansion, pre_onboarding_device_expansion, pre_onboarding_precision_level} [onboarder]
core/signal-definition-enrichment.json#/properties/onboarder
core/signal-definition.json#/properties/onboarder
80. 2 positions, 2 documents {media_buy_id*, proposal_status*} [(no shared property name)]
media-buy/get-media-buys-response.json#/properties/media_buys/items/properties/accepted_proposal/allOf/1
media-buy/media-buy-commitment-response.json#/oneOf/0/properties/accepted_proposal/allOf/1
81. 2 positions, 2 documents {mode*} [(no shared property name)]
core/budget-allocation.json#/oneOf/0
core/canonical-budget-allocation.json#/oneOf/0
82. 2 positions, 2 documents {modifiers, path, taxonomy_value_id*, value*} [value_mappings/Item]
core/signal-definition-enrichment.json#/properties/taxonomy/properties/value_mappings/items
core/signal-definition.json#/properties/taxonomy/properties/value_mappings/items
83. 2 positions, 2 documents {observed_at, subsidiary_brand_id, subsidiary_domain*} [claim]
brand/verify-brand-claim-request.json#/oneOf/0/properties/claim
brand/verify-brand-claims-request.json#/definitions/claim_entry/oneOf/0/properties/claim
84. 2 positions, 2 documents {operation, protocol, specific_context} [details]
core/tasks-get-response.json#/properties/error/properties/details
protocol/get-task-status-response.json#/properties/error/properties/details
85. 2 positions, 2 documents {property*, use_case} [claim]
brand/verify-brand-claim-request.json#/oneOf/2/properties/claim
brand/verify-brand-claims-request.json#/definitions/claim_entry/oneOf/2/properties/claim
86. 2 positions, 2 documents {provider_signed*, type*} [seed_source]
core/signal-definition-enrichment.json#/properties/modeling/properties/seed_source
core/signal-definition.json#/properties/modeling/properties/seed_source
87. 2 positions, 2 documents {providers, response_types} [trusted_match]
core/product-filters.json#/properties/trusted_match
core/product-offer-filters.json#/properties/trusted_match
88. 2 positions, 2 documents {resource_type*, type*} [subject]
core/rights-attestation-evaluation.json#/properties/reference/allOf/1/properties/subject
core/rights-constraint.json#/properties/attestation_refs/items/allOf/1/properties/subject
89. 2 positions, 2 documents {rights*} [channels/Value]
core/signal-definition-enrichment.json#/properties/data_subject_rights/properties/channels/contains
core/signal-definition.json#/properties/data_subject_rights/properties/channels/contains
90. 2 positions, 2 documents {style, url*, weight, weight_range} [font_file]
brand.json#/definitions/font_file
brand/get-brand-identity-response.json#/oneOf/0/properties/fonts/definitions/font_role/oneOf/1/properties/files/items
91. 2 positions, 2 documents {type} [indicators/Item]
creative/list-creatives-response.json#/properties/creatives/items/properties/assignments/properties/assigned_packages/items/allOf/1/properties/indicators/items
media-buy/get-media-buys-response.json#/properties/media_buys/items/properties/packages/items/properties/creative_approvals/items/allOf/1/properties/indicators/items
92. 2 positions, 2 documents {type*, value*} [uids/Item]
core/audience-member.json#/properties/uids/items
core/user-match.json#/properties/uids/items
93. 2 positions, 2 documents {unit} [(no shared property name)]
core/audience-evidence-requirements.json#/properties/maximum_age/allOf/1
core/product-audience-evidence-requirements.json#/properties/maximum_age/allOf/1
94. 2 positions, 2 documents {url*} [governance_agents/Item]
account/sync-governance-response.json#/oneOf/0/properties/accounts/items/properties/governance_agents/items
core/account.json#/properties/governance_agents/items
95. 2 positions, 2 documents {values*} [(no shared property name)]
core/geo-region-requirement.json#/properties/countries/additionalProperties/anyOf/1
core/geo-region-support.json#/properties/countries/additionalProperties/anyOf/1
The array set — 1,068 positions, which this ask deliberately does not range over — is in the
comments, in the same form.
Two things this ask is deliberately not
It is not an ask about arrays. The bundle also restates 232 array shapes it never titles,
over 1,068 positions — a larger number, and we are not asking for it, because list[X] is
written once in any typed language by construction and the only thing an array can repeat is
its element. Asked of each of those 232, what the element already is:
| the element is | structures | positions | left to name |
|---|---|---|---|
a $ref to a document you already name |
150 | 588 | nothing |
a constrained scalar — a pattern, a format |
32 | 137 | #8525's ask, already filed |
| an inline object | 21 | 46 | 20 of 21 are already in the 95 above |
an inline enum |
14 | 28 | a separate, smaller ask |
| a composition | 9 | 26 | ours |
a bare {"type": "string"} |
6 | 243 | nothing — there is no shape |
So the array layer adds one shape to this ask that the object layer did not already carry:
{height, width} at formats/canonical/display_tag.json#/properties/sizes and three other
sites. The 1,068 is a real count of repetition and it is not 1,068 things for you to name, and
saying so is part of the ask.
It is not an ask about every untitled node. We excluded 21 shapes over 72 positions whose
occurrences sit inside an if, then, else or not. A subschema inside a not says what an
instance must not look like; it has no subject, so asking for a title on it would be asking
for a name for a negation. Those are ours to handle.
Adjacent, and much smaller: 20 shapes with two titles
Separately, 20 shapes in the same population carry more than one title, which leaves the
same question from the other side. Most are a rename in flight:
| titles over one shape |
|---|
Get Task Status Request / Tasks Get Request |
List Tasks Response / Tasks List Response |
Collection List Reference / Property List Reference |
Commitment Error / Control Error |
Canonical DOOH Screen Resolution / Product DOOH Screen Resolution / Publisher DOOH Screen Resolution |
We do not merge these and we do not pick a winner — where you state two concepts both names are
right, and where you state one concept twice the duplication is worth knowing about. Listed here
because it is the same keyword and the same 20 minutes, not as a second ask.
Backport
Please apply on main and backport to 3.2.x, and to 3.1.x if that line is still taking
schema changes. #7959 is the precedent for a backport request of this kind, and #8525 carries
the same request. Adding a title cannot change validity, so a backport carries no
compatibility risk whatever.
Measured over bundle 3.2, adcp_version 3.2.4, 1,054 portable documents outside bundled/
and mcp/. The shape key is the property names, required, additionalProperties and every
narrowing keyword, with $refs resolved before comparison and title, description,
examples and property order excluded. Reproducible: group every node holding a non-empty
properties by that key, drop the groups inside a single document, and keep the groups where no
member carries a title.
Activity
KonstantinMirin commentedon Nov 4, 2026
The array set, by document and pointer — 232 shapes over 1,068 positions (part 1 of 3)
Posted for completeness and not as an ask: the body explains why each of these has its element already owned by something the bundle names. Ordered by positions descending; the bracketed tag is what the element is.
KonstantinMirin commentedon Nov 4, 2026
The array set, by document and pointer — 232 shapes over 1,068 positions (part 2 of 3)
Posted for completeness and not as an ask: the body explains why each of these has its element already owned by something the bundle names. Ordered by positions descending; the bracketed tag is what the element is.
KonstantinMirin commentedon Nov 4, 2026
The array set, by document and pointer — 232 shapes over 1,068 positions (part 3 of 3)
Posted for completeness and not as an ask: the body explains why each of these has its element already owned by something the bundle names. Ordered by positions descending; the bracketed tag is what the element is.
judgment(asks): the ask is per ENTRY, and 184 of the 353 owe none
schemas(brand): title data_subject_contestation (adcontextprotocol#8735)