From a8d78d72af2fd49293ef863dbfb87c53710162d8 Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Sun, 8 Nov 2026 03:17:08 +0000 Subject: [PATCH] feat(schema): bound the arrays and strings that are new in 3.3 or experimental, and inventory the rest Adds scripts/audit-schema-bounds.cjs and its inventory: every unbounded array and string in the schema source, by stability, request or response side and proposed limit, plus every property or collection list carried inline. Bounds the arrays and strings that are new in 3.3 or experimental: 648 maxItems/maxLength keywords in 152 schemas, written by `node scripts/audit-schema-bounds.cjs --apply`, which is idempotent and is the one command for regenerating the slice after a conflict. Stable fields are proposed for 4.0 in specs/collection-bounds-proposal.md and registered as schema_bounds_required_in_4_0. Not bounded: get_adcp_capabilities and its referenced types (#8198), inline property and collection lists, five nodes the SDK generators cannot carry a bound on, and seven 3.3 beta fields that the #8501 withdrawal PRs (#8765, #8762, #8758, #8767) remove. The script now compares with the highest 3.2.x release (3.2.8), the base lint-additive-minor uses. Build Check runs its --check-unreleased guard as npm run lint:schema-bounds, so every new 3.3 or experimental array or string arrives with a bound. The match_keys arrays #8446 added on product identity and TMP provider registration get maxItems 64, the cap media_buy.supported_match_keys already carries. The MCP parity compile limit moves from 1,384,000 to 1,386,000 bytes (the controller closure measures 1,385,040). Co-Authored-By: Claude Opus 5.5 --- .../bound-new-and-experimental-lists.md | 7 + .github/workflows/build-check.yml | 5 + docs/reference/migration/v4-compatibility.mdx | 29 + package.json | 3 +- scripts/audit-schema-bounds.cjs | 1111 +++++ scripts/schema-bounds-3-3-slice.json | 654 +++ scripts/schema-bounds-inventory.json | 3826 +++++++++++++++++ specs/collection-bounds-proposal.md | 214 + .../source/universal/v4-compatibility.yaml | 18 + .../get-account-financials-response.json | 2 + .../list-account-changes-response.json | 1 + .../account/request-account-request.json | 3 + .../account/request-account-response.json | 1 + static/schemas/source/brand.json | 4 +- .../source/brand/acquire-rights-request.json | 8 + .../source/brand/acquire-rights-response.json | 20 +- .../brand/get-brand-identity-response.json | 3 + .../source/brand/get-rights-request.json | 3 + .../source/brand/get-rights-response.json | 36 +- .../source/brand/rights-pricing-option.json | 3 + static/schemas/source/brand/rights-terms.json | 6 +- .../source/brand/search-brands-request.json | 2 + .../source/brand/search-brands-response.json | 16 +- .../source/brand/update-rights-request.json | 2 + .../source/brand/update-rights-response.json | 2 + .../comply-test-controller-request.json | 1 + .../comply-test-controller-response.json | 2 + .../source/core/account-candidate.json | 6 +- .../source/core/account-request-record.json | 8 +- .../core/agent-reporting-destination.json | 1 + .../source/core/assets/display-tag-asset.json | 1 + .../source/core/assets/html-asset.json | 1 + .../schemas/source/core/assets/zip-asset.json | 1 + .../source/core/assignment-tracker.json | 1 + .../source/core/buyer-onboarding-posture.json | 2 + .../source/core/canonical-installment.json | 8 +- .../source/core/canonical-placement.json | 8 +- .../source/core/canonical-projection-ref.json | 1 + .../source/core/canonical-proposal.json | 2 + .../source/core/creative-staged-update.json | 2 + .../schemas/source/core/delivery-metrics.json | 9 + .../source/core/demographic-gender.json | 1 + .../demographic-targeting-capability.json | 2 + .../demographic-targeting-resolution.json | 4 + .../source/core/dooh-inventory-summary.json | 4 + .../schemas/source/core/evaluator-spec.json | 6 + .../core/execution-requirement-readiness.json | 7 + static/schemas/source/core/hold-policy.json | 1 + .../source/core/installment-publication.json | 1 + static/schemas/source/core/invoice-line.json | 4 + .../schemas/source/core/media-buy-issue.json | 4 + static/schemas/source/core/media-buy.json | 1 + .../core/performance-feedback-assertion.json | 4 + .../source/core/placement-definition.json | 8 +- .../source/core/placement-evidence.json | 1 + static/schemas/source/core/placement.json | 8 +- .../core/principal-declarations-state.json | 1 + .../source/core/principal-declarations.json | 2 + .../source/core/principal-relationship.json | 1 + .../core/product-execution-readiness.json | 1 + .../schemas/source/core/product-filters.json | 2 + .../schemas/source/core/product-identity.json | 2 + static/schemas/source/core/product.json | 2 + .../source/core/proposal-offered-webhook.json | 2 + .../core/reporting-adjustment-receipt.json | 2 +- .../source/core/reporting-adjustment.json | 1 + .../reporting-canonicalization-contract.json | 10 +- .../source/core/reporting-capabilities.json | 1 + .../core/reporting-consumer-status.json | 2 +- .../source/core/reporting-control-total.json | 2 + .../source/core/reporting-coverage.json | 23 +- .../reporting-dataset-share-destination.json | 2 +- .../core/reporting-delivery-config-state.json | 1 + .../core/reporting-delivery-config.json | 2 +- .../reporting-delivery-ready-webhook.json | 1 + .../source/core/reporting-file-manifest.json | 4 +- .../reporting-ledger-changed-webhook.json | 2 +- .../source/core/reporting-obligation.json | 4 + .../source/core/reporting-receipt.json | 2 + .../core/reporting-report-definition.json | 14 +- .../source/core/reporting-resource.json | 2 +- .../source/core/reporting-revision.json | 7 +- .../source/core/reporting-schedule.json | 4 +- .../reporting-status-changed-webhook.json | 1 + .../source/core/reporting-status-issue.json | 2 + .../core/reporting-subscription-coverage.json | 3 + .../core/reporting-subscription-state.json | 3 + .../source/core/reporting-subscription.json | 4 +- .../source/core/reporting-verification.json | 2 + .../core/reporting-write-destination.json | 2 +- .../source/core/rights-constraint.json | 2 + .../schemas/source/core/seller-agent-ref.json | 1 + .../core/signal-definition-enrichment.json | 1 + .../source/core/signal-definition.json | 1 + .../schemas/source/core/signal-listing.json | 2 + .../core/signal-pricing-group-rule.json | 1 + .../source/core/signal-targeting-rules.json | 1 + .../core/spot-reporting-capability.json | 1 + .../source/core/vendor-metric-provenance.json | 1 + .../source/core/wholesale-feed-event.json | 1 + ...reative-staged-update-changed-webhook.json | 2 + .../creative/list-creatives-response.json | 2 + .../creative/sync-creatives-request.json | 3 +- .../creative/sync-creatives-response.json | 4 + .../creative/validate-input-result.json | 1 + .../source/error-details/budget-too-low.json | 3 + .../creative-live-update-unsupported.json | 4 +- .../creative-merge-rejected.json | 4 + .../unsupported-targeting-dimension.json | 6 +- .../governance/check-governance-request.json | 3 + .../governance/check-governance-response.json | 26 +- .../get-plan-audit-logs-request.json | 9 +- .../get-plan-audit-logs-response.json | 49 +- .../report-plan-adjustment-request.json | 3 + .../report-plan-adjustment-response.json | 1 + .../report-plan-outcome-request.json | 4 + .../report-plan-outcome-response.json | 4 + .../source/governance/sync-plans-request.json | 44 +- .../governance/sync-plans-response.json | 7 + .../media-buy/build-creative-request.json | 2 + .../media-buy/build-creative-response.json | 1 + .../get-media-buy-delivery-response.json | 2 + .../get-media-buy-issue-request.json | 2 + .../get-media-buy-issue-response.json | 1 + .../media-buy/get-media-buys-response.json | 2 + .../get-reporting-status-request.json | 6 +- .../get-reporting-status-response.json | 31 +- .../media-buy/list-collections-request.json | 15 +- .../media-buy/list-collections-response.json | 1 + .../media-buy/list-proposals-request.json | 6 +- .../media-buy/list-proposals-response.json | 4 +- ...provide-performance-feedback-response.json | 1 + .../report-media-buy-issue-request.json | 3 + .../report-media-buy-issue-response.json | 1 + .../media-buy/sync-audiences-response.json | 6 +- .../sync-event-sources-response.json | 1 + .../source/signals/get-signals-response.json | 2 + .../si-get-offering-request.json | 2 + .../si-get-offering-response.json | 16 + .../sponsored-intelligence/si-identity.json | 16 +- .../si-initiate-session-request.json | 5 + .../si-initiate-session-response.json | 4 + .../si-send-message-request.json | 3 + .../si-send-message-response.json | 14 +- .../si-sponsored-context-receipt.json | 4 + .../si-sponsored-context.json | 8 + .../si-terminate-session-request.json | 3 + .../si-terminate-session-response.json | 3 + .../sponsored-intelligence/si-ui-element.json | 35 +- .../trust/v1/trust-acknowledgements.json | 4 +- static/schemas/source/trust/v1/trust.json | 29 +- .../trusted-match/available-package.json | 5 + .../trusted-match/context-match-request.json | 18 +- .../trusted-match/context-match-response.json | 9 +- .../schemas/source/trusted-match/error.json | 2 + .../trusted-match/identity-match-request.json | 15 +- .../identity-match-response.json | 6 +- .../schemas/source/trusted-match/offer.json | 5 +- .../provider-context-match-response.json | 9 +- .../provider-identity-match-response.json | 5 +- .../trusted-match/provider-registration.json | 3 + tests/audit-schema-bounds.test.cjs | 394 ++ tests/mcp-schema-projection.test.cjs | 5 +- 163 files changed, 6951 insertions(+), 154 deletions(-) create mode 100644 .changeset/bound-new-and-experimental-lists.md create mode 100644 scripts/audit-schema-bounds.cjs create mode 100644 scripts/schema-bounds-3-3-slice.json create mode 100644 scripts/schema-bounds-inventory.json create mode 100644 specs/collection-bounds-proposal.md create mode 100644 tests/audit-schema-bounds.test.cjs diff --git a/.changeset/bound-new-and-experimental-lists.md b/.changeset/bound-new-and-experimental-lists.md new file mode 100644 index 00000000000..c39729d7332 --- /dev/null +++ b/.changeset/bound-new-and-experimental-lists.md @@ -0,0 +1,7 @@ +--- +"adcontextprotocol": patch +--- + +Bound the arrays and strings that are new in 3.3 or experimental. 648 `maxItems` and `maxLength` keywords go onto 152 schemas, chosen from the tiers in `specs/collection-bounds-proposal.md`: 32 for enum sets and closed vocabularies, 100 for typical lists, 255 for identifiers and names, 2,000 for prose, 2,048 for URLs. No stable field changes and no property is added, removed or made required, so the additive-minor check has nothing to compare: each field is either absent from 3.2.8 or experimental. `get_adcp_capabilities` is untouched (#8198), and so are the 3.3 beta fields that #8501 withdraws. + +Adds `scripts/audit-schema-bounds.cjs`, an inventory of every remaining unbounded array and string by stability and by request or response side, with a proposed limit for each. The stable fields are proposed for 4.0 and registered as the `schema_bounds_required_in_4_0` check in the v4 compatibility registry. Property and collection lists carried inline are flagged to move out of band in 4.0. diff --git a/.github/workflows/build-check.yml b/.github/workflows/build-check.yml index 31840fc0eb1..27524a3ca53 100644 --- a/.github/workflows/build-check.yml +++ b/.github/workflows/build-check.yml @@ -94,6 +94,11 @@ jobs: ADCP_ADDITIVE_MINOR_BASELINE_REF: ${{ github.event_name == 'pull_request' && format('origin/{0}', github.base_ref) || '' }} run: npm run test:additive-minor + - name: Schema bounds guard (new and experimental lists and strings are bounded) + # Fails when an array or string that is new in 3.3 or experimental has no + # maxItems/maxLength. Fix: node scripts/audit-schema-bounds.cjs --apply + run: npm run lint:schema-bounds + - name: Fetch 3.0.x for error-code drift comparison if: github.ref != 'refs/heads/3.0.x' && github.base_ref != '3.0.x' run: git fetch --depth=1 origin +3.0.x:refs/remotes/origin/3.0.x diff --git a/docs/reference/migration/v4-compatibility.mdx b/docs/reference/migration/v4-compatibility.mdx index 0dd91d3d139..c0ab119f42e 100644 --- a/docs/reference/migration/v4-compatibility.mdx +++ b/docs/reference/migration/v4-compatibility.mdx @@ -35,6 +35,7 @@ In raw runner output, a check observed by a validation appears as a `validation_ | [`signed_requests_specialism_deprecated`](#signed_requests_specialism_deprecated) | [#3078](https://github.com/adcontextprotocol/adcp/issues/3078) | All agents | Notice on `signed_requests` | | [`request_signing_required_in_4_0`](#request_signing_required_in_4_0) | [#2307](https://github.com/adcontextprotocol/adcp/issues/2307) | Sellers | `media_buy_seller` capability discovery | | [`legacy_hmac_fallback_removed_in_4_0`](#legacy_hmac_fallback_removed_in_4_0) | [#4205](https://github.com/adcontextprotocol/adcp/issues/4205) | All agents | `capability_discovery` | +| [`schema_bounds_required_in_4_0`](#schema_bounds_required_in_4_0) | [#8512](https://github.com/adcontextprotocol/adcp/issues/8512) | All agents | Not observable in 3.x | | [`capabilities_structural_bounds_required_in_4_0`](#capabilities_structural_bounds_required_in_4_0) | [#8198](https://github.com/adcontextprotocol/adcp/issues/8198) | All agents | Not observable | | [`purchase_target_audiences_required_in_4_0`](#purchase_target_audiences_required_in_4_0) | [#8125](https://github.com/adcontextprotocol/adcp/issues/8125) | Sellers | Not observable in 3.x | | [`seller_held_change_terms_required_in_4_0`](#seller_held_change_terms_required_in_4_0) | [#8087](https://github.com/adcontextprotocol/adcp/issues/8087) | Sellers | Not observable in 3.x | @@ -112,6 +113,34 @@ Request signing is optional in 3.x. 4.0 requires it on spend-committing operatio **Fix:** sign webhooks with RFC 9421 only and stop advertising `legacy_hmac_fallback`. See [Webhooks](/docs/building/by-layer/L3/webhooks). + +### Lists and strings carry bounds + +**Check id:** `schema_bounds_required_in_4_0` · **Change:** new requirement + +**Detects:** a payload carries an array longer, or a string longer, than the 4.0 bound for its field. A 3.x run cannot observe it, because 3.x schemas carry no bound on stable fields. + +The working group decided to bound list sizes and string lengths across the protocol. 3.3 bounds the arrays and strings that are new in 3.3 or experimental. 4.0 bounds the stable ones, because tightening a stable field is not a minor-release change. Proposed limits by kind of field: + +| Kind of field | Limit | +|---|---| +| A set of enum values | the enum size, with a floor of 32 | +| Attributes of one object (keys, identifiers, closed vocabularies) | 32 items | +| Country and language codes (ISO 3166-1, ISO 639); region codes (ISO 3166-2) | 256 items; 1,000 items | +| A list nested in an object | 100 items | +| A request batch or id list; the response that pages it | 100 items; 1,000 items | +| Catalog-scale payloads (records, events, inline catalog items) | 10,000 items | +| Identifiers, names, labels | 255 characters | +| DNS names | 253 characters | +| Prose (reasons, messages, descriptions) | 2,000 characters | +| URLs | 2,048 characters | +| Cursors, tokens, consent strings | 4,096 characters | +| Long bodies (asset content, briefs, preview markup) | 100,000 characters | + +The limits are proposals until the owning working groups confirm them. The same release moves property and collection lists out of band: they are passed by reference (`agent_url` and `list_id`) and never inline. + +**Fix:** keep lists and strings inside these limits, and send property and collection lists by reference. The per-field inventory and the reasoning are in [the proposal](https://github.com/adcontextprotocol/adcp/blob/main/specs/collection-bounds-proposal.md). + ### Capabilities stay within their structural bounds diff --git a/package.json b/package.json index 79a6a191bf6..f16f9930593 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "test:canonical-negative": "node tests/canonical-negative-fixtures.test.cjs", "test:audio-radio": "node --test --test-force-exit --test-timeout=30000 tests/audio-radio-formats.test.cjs", "test:canonical-conventions": "node tests/canonical-format-conventions.test.cjs", - "test:contracts": "node --test --test-force-exit --test-timeout=30000 tests/a2a-response-extraction.test.cjs tests/agent-onboarding-capability.test.cjs tests/docs-json-field-audit.test.cjs tests/accessibility-governance-category.test.cjs tests/asset-access-deprecation.test.cjs tests/brand-localization.test.cjs tests/brand-response-authorization-vectors.test.cjs tests/brand-signed-response-vectors.test.cjs tests/build-schemas-preserve-subschema-ids.test.cjs tests/certification-experience-ui.test.cjs tests/counterparty-asserted-capability-bounds.test.cjs tests/capabilities-structural-bounds.test.cjs tests/demographic-delivery-reporting-contract.test.cjs tests/lint-storyboard-idempotency-generated-context.test.cjs tests/lint-vendor-metric-uniqueness.test.cjs tests/list-creative-formats-pricing-surface.test.cjs tests/mcp-response-extraction.test.cjs tests/media-buy-name-contract.test.cjs tests/placement-catalog-schema.test.cjs tests/preview-creative-async-opt-in.test.cjs tests/preview-documentation-safety.test.cjs tests/proposal-negotiation-guide.test.cjs tests/registry-measurement-link-trust.test.cjs tests/relationship-scoped-indicators.test.cjs tests/response-size-bounds.test.cjs tests/retry-after-integer.test.cjs tests/rewrite-dist-relative-links.test.cjs tests/run-storyboards-isolation.test.cjs tests/spot-delivery-reporting-contract.test.cjs tests/delivery-rows-impressions-optional.test.cjs tests/tmp-router-merge-semantics.test.cjs tests/webhook-payload-extraction.test.cjs tests/reporting-webhook-authentication.test.cjs && node tests/canonical-format-classification-vectors.test.cjs && node tests/changeset-protocol-scope.test.cjs && node tests/tracking-event-enums.test.cjs && npm run test:canonical-fixtures && npm run test:canonical-negative && npm run test:canonical-conventions", + "test:contracts": "node --test --test-force-exit --test-timeout=30000 tests/audit-schema-bounds.test.cjs tests/a2a-response-extraction.test.cjs tests/agent-onboarding-capability.test.cjs tests/docs-json-field-audit.test.cjs tests/accessibility-governance-category.test.cjs tests/asset-access-deprecation.test.cjs tests/brand-localization.test.cjs tests/brand-response-authorization-vectors.test.cjs tests/brand-signed-response-vectors.test.cjs tests/build-schemas-preserve-subschema-ids.test.cjs tests/certification-experience-ui.test.cjs tests/counterparty-asserted-capability-bounds.test.cjs tests/capabilities-structural-bounds.test.cjs tests/demographic-delivery-reporting-contract.test.cjs tests/lint-storyboard-idempotency-generated-context.test.cjs tests/lint-vendor-metric-uniqueness.test.cjs tests/list-creative-formats-pricing-surface.test.cjs tests/mcp-response-extraction.test.cjs tests/media-buy-name-contract.test.cjs tests/placement-catalog-schema.test.cjs tests/preview-creative-async-opt-in.test.cjs tests/preview-documentation-safety.test.cjs tests/proposal-negotiation-guide.test.cjs tests/registry-measurement-link-trust.test.cjs tests/relationship-scoped-indicators.test.cjs tests/response-size-bounds.test.cjs tests/retry-after-integer.test.cjs tests/rewrite-dist-relative-links.test.cjs tests/run-storyboards-isolation.test.cjs tests/spot-delivery-reporting-contract.test.cjs tests/delivery-rows-impressions-optional.test.cjs tests/tmp-router-merge-semantics.test.cjs tests/webhook-payload-extraction.test.cjs tests/reporting-webhook-authentication.test.cjs && node tests/canonical-format-classification-vectors.test.cjs && node tests/changeset-protocol-scope.test.cjs && node tests/tracking-event-enums.test.cjs && npm run test:canonical-fixtures && npm run test:canonical-negative && npm run test:canonical-conventions", "test:canonical-reference-resolver": "node --test --test-force-exit --test-timeout=30000 tests/canonical-reference-resolver.test.cjs", "test:canonical-pixel-ratio": "node --test --test-force-exit --test-timeout=30000 tests/canonical-image-pixel-ratio-vectors.test.cjs tests/canonical-display-acceptance-vectors.test.cjs", "test:premium-display-formats": "node --test --test-force-exit --test-timeout=30000 tests/premium-display-format-validation.test.cjs", @@ -152,6 +152,7 @@ "test:test-coverage": "node --test --test-force-exit tests/test-coverage-registration.test.cjs", "test:error-code-drift": "node scripts/lint-error-code-drift.cjs", "lint:additive-minor": "node scripts/lint-additive-minor.cjs", + "lint:schema-bounds": "node scripts/audit-schema-bounds.cjs --check-unreleased", "test:additive-minor": "node --test --test-force-exit --test-timeout=30000 tests/lint-additive-minor.test.cjs && npm run lint:additive-minor", "test:language-tag-refs": "node --test --test-force-exit --test-timeout=30000 tests/lint-language-tag-refs.test.cjs && node scripts/lint-language-tag-refs.cjs", "test:compliance-snippets": "node --test --test-force-exit --test-timeout=30000 tests/generate-compliance-snippets.node.mjs tests/link-compliance-symbols.node.mjs && npm run build:compliance -- --check", diff --git a/scripts/audit-schema-bounds.cjs b/scripts/audit-schema-bounds.cjs new file mode 100644 index 00000000000..2c4729ac2db --- /dev/null +++ b/scripts/audit-schema-bounds.cjs @@ -0,0 +1,1111 @@ +#!/usr/bin/env node +/** + * Inventory of unbounded arrays and strings in static/schemas/source/**. + * + * Why: the working group decided (WG Session C, 2026-10-26) to bound list + * sizes and string lengths across the protocol. Tightening a released field + * is not a minor-release change, so this script classifies every unbounded + * node by stability and proposes a limit for each, and a 3.3 slice may touch + * only the nodes that are new in 3.3 or experimental. + * + * What it records, for every array without `maxItems` and every string + * without `maxLength` (strings constrained by `enum`, `const`, a fixed-length + * `format` or a bounded `pattern` are skipped): + * + * - file and JSON Pointer + * - side: request, response, both, or other (reachable from no task + * request/response schema, for example adagents.json or registry documents) + * - stability: stable | experimental | new-3.3 + * - a proposed limit, its tier and a one-line rationale + * - action: apply in 3.3, tighten in 4.0, or move out of band (4.0) + * + * It also lists every array that carries a property or collection list INLINE + * (an array of properties or domains) instead of by reference, bounded or not. + * The WG rule is that such lists are always passed by reference. + * + * Usage: + * node scripts/audit-schema-bounds.cjs print the summary + * node scripts/audit-schema-bounds.cjs --write rewrite the inventory JSON + * node scripts/audit-schema-bounds.cjs --check fail if the committed inventory is stale + * node scripts/audit-schema-bounds.cjs --check-unreleased + * fail if an unbounded array or string is new in 3.3 + * or experimental (the 3.3 slice is complete) + * node scripts/audit-schema-bounds.cjs --json print the inventory to stdout + * node scripts/audit-schema-bounds.cjs --apply add every "apply in 3.3" bound to the schema + * source, record it in schema-bounds-3-3-slice.json + * and rewrite the inventory. Idempotent: rerun it + * after taking main's copy of a conflicting schema. + * + * Stability rules (conservative, so that an edit proposed for 3.3 can never + * touch a released field): + * - experimental: the node or an ancestor in the same file carries + * `x-status: "experimental"`. + * - new-3.3: not experimental, and the node or an ancestor in the same file + * carries `x-added-in: "3.3.0"`, and the same pointer is not present in + * the last stable release (the highest 3.2.x in dist/schemas, the base + * lint-additive-minor uses). A marker that conflicts with the release is + * reported as stable. + * - stable: everything else. `absent_from_last_stable` is recorded for these + * too, as a signal that a marker is missing; it never promotes a node. + * + * Limits of the analysis: $ref resolution covers `/schemas/...` ids and + * in-file `#/...` pointers; side tracing follows $refs but not prose. + */ + +'use strict'; + +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); + +const REPO_ROOT = path.join(__dirname, '..'); +const SOURCE_DIR = path.join(REPO_ROOT, 'static/schemas/source'); +const DIST_DIR = path.join(REPO_ROOT, 'dist/schemas'); +const INVENTORY_PATH = path.join(__dirname, 'schema-bounds-inventory.json'); +const SLICE_PATH = path.join(__dirname, 'schema-bounds-3-3-slice.json'); +const NEW_VERSION = '3.3.0'; + +// The highest stable release below NEW_VERSION, the base lint-additive-minor also uses. +function lastStableRelease(distDir) { + const [major, minor] = NEW_VERSION.split('.').map(Number); + const releases = fs.existsSync(distDir) + ? fs.readdirSync(distDir).filter(name => /^\d+\.\d+\.\d+$/.test(name)).map(name => name.split('.').map(Number)) + : []; + const below = releases.filter(([ma, mi]) => ma === major && mi < minor).sort((a, b) => a[1] - b[1] || a[2] - b[2]); + return below.length ? below[below.length - 1].join('.') : null; +} + +// Schemas another workstream owns. The inventory records every node reachable +// from them, through $refs, but the 3.3 slice does not edit those nodes: the +// owner documents a worst-case size for the response that a new bound would move. +const OWNED_ELSEWHERE = { + 'protocol/get-adcp-capabilities-response.json': '#8198', +}; + +// Nodes the SDK generators cannot carry a bound on today. Each was found by +// regenerating the TypeScript and Python SDKs from a bundle that bounded it +// (the validate-schema-bundle workflow runs the same generation). +const SDK_GENERATION_EXCLUSIONS = { + 'core/targeting.json#/properties/collection_lists': 'the TypeScript SDK hoists the bounded array into a type alias and cannot restore its maxItems', + 'core/targeting.json#/properties/collection_lists_exclude': 'the TypeScript SDK hoists the bounded array into a type alias and cannot restore its maxItems', + 'brand/update-rights-response.json#/oneOf/0/properties/generation_credentials': 'the Python SDK post-generation fix fix_update_rights_legacy_response_defaults matches the unbounded field text', + 'core/reporting-subscription-coverage.json#/properties/excluded/items/properties/package_ids': 'the TypeScript SDK reduces excluded[] items (an allOf of if/then rules) to z.object({}).passthrough(), so its maxItems post-process finds no ZodArray to bound', +}; + +// 3.3 beta fields that the #8501 withdrawal PRs remove. They get no bound, so +// this slice and those PRs merge in either order without editing the same lines. +const WITHDRAWN = { + 'compliance/comply-test-controller-response.json#/oneOf/3/properties/forced/properties/proposal_id': '#8765 (entry 1)', + 'core/sla-window.json#/properties/business_calendar_id': '#8762 (entries 11 and 12)', + 'creative/sync-creatives-request.json#/properties/assignments/items/properties/trackers': '#8758 (entry 21)', + 'media-buy/get-products-response.json#/properties/refinement_applied/items/oneOf/1/properties/result_product_id': '#8758 (entry 23)', + 'media-buy/get-products-response.json#/properties/execution_readiness/properties/version': '#8758 (moves to list_products)', + 'core/creative-assignment.json#/properties/trackers': '#8767', + 'core/measurement-terms.json#/properties/billing_measurement/properties/counting_mechanisms': '#8767', +}; + +// Formats the inventory skips. `uri` is skipped on request but is not length-bounded, so it is counted separately. +const SKIP_FORMATS = new Set(['date-time', 'uri', 'email', 'uuid', 'date', 'time', 'ipv4', 'ipv6']); + +// Keywords whose value is a subschema, a list of subschemas, or a map of them. +const SCHEMA_KEYS = ['additionalProperties', 'items', 'additionalItems', 'contains', 'propertyNames', 'not', 'if', 'then', 'else', 'unevaluatedItems', 'unevaluatedProperties']; +const SCHEMA_LIST_KEYS = ['allOf', 'anyOf', 'oneOf', 'prefixItems']; +const SCHEMA_MAP_KEYS = ['properties', 'patternProperties', 'definitions', '$defs']; + +// --------------------------------------------------------------------------- +// Loading and pointers +// --------------------------------------------------------------------------- + +function listJson(dir, base = dir) { + return fs.readdirSync(dir, { withFileTypes: true }).flatMap(entry => { + const full = path.join(dir, entry.name); + if (entry.isDirectory()) return listJson(full, base); + return entry.name.endsWith('.json') ? [path.relative(base, full).split(path.sep).join('/')] : []; + }); +} + +const esc = seg => String(seg).replace(/~/g, '~0').replace(/\//g, '~1'); + +function getPointer(doc, pointer) { + if (pointer === '' || pointer === '#') return doc; + let node = doc; + for (const raw of pointer.replace(/^#/, '').split('/').slice(1)) { + const seg = decodeURIComponent(raw).replace(/~1/g, '/').replace(/~0/g, '~'); + if (node === null || typeof node !== 'object' || !(seg in node)) return undefined; + node = node[seg]; + } + return node; +} + +/** Calls fn(node, pointer, ancestors) for every subschema in a document. */ +function walkSchemas(node, pointer, fn, ancestors = []) { + if (!node || typeof node !== 'object' || Array.isArray(node)) return; + fn(node, pointer, ancestors); + const next = [...ancestors, node]; + for (const key of SCHEMA_KEYS) { + const child = node[key]; + if (Array.isArray(child)) child.forEach((c, i) => walkSchemas(c, `${pointer}/${key}/${i}`, fn, next)); + else if (child && typeof child === 'object') walkSchemas(child, `${pointer}/${key}`, fn, next); + } + for (const key of SCHEMA_LIST_KEYS) { + if (Array.isArray(node[key])) node[key].forEach((c, i) => walkSchemas(c, `${pointer}/${key}/${i}`, fn, next)); + } + for (const key of SCHEMA_MAP_KEYS) { + const map = node[key]; + if (map && typeof map === 'object' && !Array.isArray(map)) { + for (const [name, child] of Object.entries(map)) walkSchemas(child, `${pointer}/${key}/${esc(name)}`, fn, next); + } + } + if (node.dependencies && typeof node.dependencies === 'object') { + for (const [name, child] of Object.entries(node.dependencies)) { + if (!Array.isArray(child)) walkSchemas(child, `${pointer}/dependencies/${esc(name)}`, fn, next); + } + } +} + +function resolveRef(ref, fromFile, docs) { + const [target, fragment = ''] = ref.split('#'); + let file = fromFile; + if (target) { + file = target.startsWith('/schemas/') ? target.slice('/schemas/'.length) : path.posix.normalize(path.posix.join(path.posix.dirname(fromFile), target)); + } + const doc = docs.get(file); + if (!doc) return null; + const pointer = fragment ? (fragment.startsWith('/') ? fragment : null) : ''; + if (pointer === null) return null; + const node = getPointer(doc, pointer); + return node === undefined ? null : { file, pointer, node }; +} + +// --------------------------------------------------------------------------- +// Classification of nodes +// --------------------------------------------------------------------------- + +function typeIncludes(node, type) { + return node.type === type || (Array.isArray(node.type) && node.type.includes(type)); +} + +/** True when a pattern is anchored at both ends and has no unbounded quantifier. */ +function isBoundedPattern(pattern) { + if (typeof pattern !== 'string' || !pattern.startsWith('^') || !pattern.endsWith('$') || pattern.endsWith('\\$')) return false; + const stripped = pattern.replace(/\\./g, '_').replace(/\[(?:\\.|[^\]\\])*\]/g, '_'); + if (/[*+]/.test(stripped) || /\{\d+,\}/.test(stripped)) return false; + if (/\(\?[=!<]/.test(stripped)) return false; + return true; +} + +function branchesAreClosed(node) { + for (const key of ['oneOf', 'anyOf']) { + const branches = node[key]; + if (Array.isArray(branches) && branches.length > 0 && branches.every(b => b && (b.const !== undefined || Array.isArray(b.enum)))) return true; + } + return false; +} + +function stringSkipReason(node) { + if (Array.isArray(node.enum)) return 'enum'; + if (node.const !== undefined) return 'const'; + if (node.format && SKIP_FORMATS.has(node.format)) return `format:${node.format}`; + if (branchesAreClosed(node)) return 'closed-branches'; + if (isBoundedPattern(node.pattern)) return 'bounded-pattern'; + if (typeof node.maxLength === 'number') return 'bounded'; + return null; +} + +/** + * A definition (or file) that no release contains and that only new or + * experimental nodes reference is itself new, even without its own marker. + * Returns 'experimental' | 'new-3.3' | null. + */ +function buildInboundIndex(docs) { + const inbound = new Map(); + for (const [file, doc] of docs) { + walkSchemas(doc, '', (node, pointer, ancestors) => { + if (typeof node.$ref !== 'string') return; + const target = resolveRef(node.$ref, file, docs); + if (!target) return; + const chain = [...ancestors, node]; + const key = `${target.file}#${target.pointer}`; + if (!inbound.has(key)) inbound.set(key, []); + const top = pointer.match(/^\/(definitions|\$defs)\/[^/]+/); + inbound.get(key).push({ + experimental: chain.some(n => n['x-status'] === 'experimental'), + marked: chain.some(n => n['x-added-in'] === NEW_VERSION), + from: { file, rootPointer: top ? top[0] : '', pointer }, + }); + }); + } + return inbound; +} + +function derivedNewness(file, pointer, inbound, lastStableDocs, visiting = new Set()) { + const top = pointer.match(/^\/(definitions|\$defs)\/[^/]+/); + const rootPointer = top ? top[0] : ''; + const prior = lastStableDocs.get(file); + if (prior && (!top || getPointer(prior, rootPointer) !== undefined)) return null; + const key = `${file}#${rootPointer}`; + const refs = inbound.get(key); + if (!refs || refs.length === 0 || visiting.has(key)) return null; + visiting.add(key); + // A reference from a definition that is itself new counts as new. + const kinds = refs.map(r => { + if (r.experimental) return 'experimental'; + if (r.marked) return 'new-3.3'; + return derivedNewness(r.from.file, r.from.rootPointer, inbound, lastStableDocs, visiting); + }); + visiting.delete(key); + if (kinds.every(k => k === 'experimental')) return 'experimental'; + return kinds.every(Boolean) ? 'new-3.3' : null; +} + + +// --------------------------------------------------------------------------- +// Wire-path check against the last stable release +// --------------------------------------------------------------------------- +// +// A field can be new in a file yet old on the wire: 3.3 moved the relying-party +// object out of brand.json into core/identity-relying-party.json, so the new +// file's properties are absent from the released file of the same name. Comparing +// pointers per file would call them new. Instead, walk from every schema that +// references the node back to its roots, and ask whether the release has the same +// path from the same root, following $refs on both sides. Combiner branches +// are searched without regard to index, so a doubtful match counts as +// existing, which keeps the node stable. + +const DEF_ROOT = /^\/(definitions|\$defs)\/[^/]+/; +const MAX_WIRE_PATHS = 4000; + +/** Wire paths to a node as [{root, segs}], where segs are keyword steps from the root file. */ +function wirePaths(file, pointer, inbound, memo, active = new Set()) { + const def = pointer.match(DEF_ROOT); + const rootPointer = def ? def[0] : ''; + const suffix = pointer.slice(rootPointer.length).split('/').filter(Boolean).map(seg => seg.replace(/~1/g, '/').replace(/~0/g, '~')); + const key = `${file}#${rootPointer}`; + let base = memo.get(key); + if (!base) { + base = []; + if (!rootPointer) base.push({ root: file, segs: [] }); + if (!active.has(key)) { + active.add(key); + for (const ref of inbound.get(key) || []) { + for (const p of wirePaths(ref.from.file, ref.from.pointer, inbound, memo, active)) { + base.push(p); + if (base.length >= MAX_WIRE_PATHS) break; + } + if (base.length >= MAX_WIRE_PATHS) break; + } + active.delete(key); + } + if (active.size === 0) memo.set(key, base); + } + return base.map(p => ({ root: p.root, segs: [...p.segs, ...suffix] })); +} + +/** Nodes that a schema node stands for: itself, its $ref target and every combiner branch, transitively. */ +function expand(node, file, docs, seen = new Set()) { + const out = []; + const stack = [{ node, file }]; + while (stack.length) { + const { node: n, file: f } = stack.pop(); + if (!n || typeof n !== 'object' || seen.has(n)) continue; + seen.add(n); + out.push({ node: n, file: f }); + if (typeof n.$ref === 'string') { + const target = resolveRef(n.$ref, f, docs); + if (target) stack.push({ node: target.node, file: target.file }); + } + for (const k of ['allOf', 'anyOf', 'oneOf']) if (Array.isArray(n[k])) for (const b of n[k]) stack.push({ node: b, file: f }); + for (const k of ['if', 'then', 'else']) if (n[k]) stack.push({ node: n[k], file: f }); + } + return out; +} + +/** Looks the segment path up in the last stable release; returns {found, onlyExperimental}. */ +function lookupWire(docs, root, segs) { + const doc = docs.get(root); + if (!doc) return { found: false, onlyExperimental: false }; + let frontier = [{ node: doc, file: root, experimental: doc['x-status'] === 'experimental' }]; + for (let i = 0; i < segs.length && frontier.length; i++) { + const seg = segs[i]; + const next = []; + // Combiner indexes, and the `properties` / `items` keywords themselves, carry no meaning here. + if (/^(oneOf|anyOf|allOf|prefixItems)$/.test(seg) || /^\d+$/.test(seg)) continue; + for (const cur of frontier) { + for (const { node, file } of expand(cur.node, cur.file, docs)) { + const exp = cur.experimental || node['x-status'] === 'experimental'; + let child; + if (seg === 'properties' || seg === 'patternProperties') { + const name = segs[i + 1]; + child = node[seg] && node[seg][name]; + if (child) next.push({ node: child, file, experimental: exp || child['x-status'] === 'experimental', skip: 1 }); + continue; + } + if (seg === 'items' || seg === 'additionalProperties' || seg === 'additionalItems' || seg === 'contains' || seg === 'propertyNames' || seg === 'not') { + child = Array.isArray(node[seg]) ? undefined : node[seg]; + if (child && typeof child === 'object') next.push({ node: child, file, experimental: exp || child['x-status'] === 'experimental', skip: 0 }); + continue; + } + if (seg === 'definitions' || seg === '$defs') { + child = node[seg] && node[seg][segs[i + 1]]; + if (child) next.push({ node: child, file, experimental: exp || child['x-status'] === 'experimental', skip: 1 }); + } + } + } + // `properties` and `definitions` consume the following name segment. + const consumed = next.find(n => n.skip === 1); + if (consumed) i += 1; + frontier = next.map(({ node, file, experimental }) => ({ node, file, experimental })); + } + if (!frontier.length) return { found: false, onlyExperimental: false }; + return { found: true, onlyExperimental: frontier.every(f => f.experimental) }; +} + +/** + * Re-checks a node that the markers call new or experimental. Returns + * 'released' when the last stable release carries it on the wire as a stable + * field, 'experimental-then' when that release carried it but already marked + * experimental, and 'absent' otherwise. + */ +function releasedOnWire(file, pointer, inbound, memo, lastStableDocs) { + const paths = wirePaths(file, pointer, inbound, memo); + if (paths.length === 0) return 'absent'; + let experimentalThen = false; + for (const p of paths) { + const hit = lookupWire(lastStableDocs, p.root, p.segs); + if (hit.found && !hit.onlyExperimental) return 'released'; + if (hit.found) experimentalThen = true; + } + return experimentalThen ? 'experimental-then' : 'absent'; +} + +function stabilityOf(file, pointer, ancestors, node, lastStableDocs, inbound, wireMemo) { + const chain = [...ancestors, node]; + const experimental = chain.some(n => n['x-status'] === 'experimental'); + const marked = chain.some(n => n['x-added-in'] === NEW_VERSION); + const priorDoc = lastStableDocs.get(file); + const indexed = /\/(oneOf|anyOf|allOf|prefixItems)\/\d+(\/|$)/.test(pointer); + let inLastStable = 'unknown'; + if (!priorDoc) inLastStable = 'no'; + else if (getPointer(priorDoc, pointer) !== undefined) inLastStable = 'yes'; + else if (!indexed) inLastStable = 'no'; + let stability = experimental ? 'experimental' : marked && inLastStable !== 'yes' ? 'new-3.3' : 'stable'; + let derived = false; + if (stability === 'stable') { + const viaRefs = derivedNewness(file, pointer, inbound, lastStableDocs); + if (viaRefs) { + stability = viaRefs; + derived = true; + } + } + let wireConflict = false; + if (stability !== 'stable') { + const wire = releasedOnWire(file, pointer, inbound, wireMemo, lastStableDocs); + if (wire === 'released') { + stability = 'stable'; + wireConflict = true; + } else if (wire === 'experimental-then') { + stability = 'experimental'; + } + } + return { stability, derived, markedNew: marked, inLastStable, markerConflict: (marked && inLastStable === 'yes' && !experimental) || wireConflict }; +} + +// --------------------------------------------------------------------------- +// Side tracing: which task request/response schemas reach each node +// --------------------------------------------------------------------------- + +const REQUEST_ROOT = /-request\.json$/; +const RESPONSE_ROOT = /(-response\.json|-async-response-[a-z-]+\.json|-webhook(-[a-z-]+)?\.json|-webhook-payload\.json)$/; + +function rootSide(file) { + if (REQUEST_ROOT.test(file)) return 'request'; + if (RESPONSE_ROOT.test(file)) return 'response'; + return null; +} + +function traceSides(docs) { + const reached = new Map(); // `${file}#${pointer}` -> Set('request' | 'response') + const unresolved = new Set(); + for (const side of ['request', 'response']) { + const seen = new Set(); + const visit = (file, pointer, node) => { + const key = `${file}#${pointer}`; + if (seen.has(key)) return; + seen.add(key); + if (!reached.has(key)) reached.set(key, new Set()); + reached.get(key).add(side); + if (typeof node.$ref === 'string') { + const target = resolveRef(node.$ref, file, docs); + if (target) visit(target.file, target.pointer, target.node); + else unresolved.add(`${file}#${pointer} -> ${node.$ref}`); + } + const children = []; + for (const k of SCHEMA_KEYS) { + const c = node[k]; + if (Array.isArray(c)) c.forEach((x, i) => children.push([`${pointer}/${k}/${i}`, x])); + else if (c && typeof c === 'object') children.push([`${pointer}/${k}`, c]); + } + for (const k of SCHEMA_LIST_KEYS) { + if (Array.isArray(node[k])) node[k].forEach((x, i) => children.push([`${pointer}/${k}/${i}`, x])); + } + for (const k of ['properties', 'patternProperties']) { + if (node[k] && typeof node[k] === 'object') for (const [n, x] of Object.entries(node[k])) children.push([`${pointer}/${k}/${esc(n)}`, x]); + } + for (const [p, c] of children) if (c && typeof c === 'object' && !Array.isArray(c)) visit(file, p, c); + }; + for (const [file, doc] of docs) if (rootSide(file) === side) visit(file, '', doc); + } + return { reached, unresolved }; +} + +/** Every node reachable from one schema file, following $refs: a Set of `${file}#${pointer}`. */ +function reachableFrom(docs, rootFile) { + const seen = new Set(); + const visit = (file, pointer, node) => { + const key = `${file}#${pointer}`; + if (seen.has(key)) return; + seen.add(key); + if (typeof node.$ref === 'string') { + const target = resolveRef(node.$ref, file, docs); + if (target) visit(target.file, target.pointer, target.node); + } + walkChildren(node, pointer, (p, c) => visit(file, p, c)); + }; + if (docs.has(rootFile)) visit(rootFile, '', docs.get(rootFile)); + return seen; +} + +function walkChildren(node, pointer, fn) { + for (const k of SCHEMA_KEYS) { + const c = node[k]; + if (Array.isArray(c)) c.forEach((x, i) => fn(`${pointer}/${k}/${i}`, x)); + else if (c && typeof c === 'object') fn(`${pointer}/${k}`, c); + } + for (const k of SCHEMA_LIST_KEYS) { + if (Array.isArray(node[k])) node[k].forEach((x, i) => fn(`${pointer}/${k}/${i}`, x)); + } + for (const k of ['properties', 'patternProperties']) { + if (node[k] && typeof node[k] === 'object') for (const [n, x] of Object.entries(node[k])) fn(`${pointer}/${k}/${esc(n)}`, x); + } +} + +// --------------------------------------------------------------------------- +// Proposed limits +// --------------------------------------------------------------------------- + +const TIERS = { + 'array-enum': 'Set of enum values, or of codes from a standard code set: bounded by the set, with a floor of 32 (256 for ISO 3166-1 and ISO 639 codes, 1,000 for ISO 3166-2 regions).', + 'array-small': 'Small closed sets and tuples (tags, sizes, flags, ranges): 32.', + 'array-typical': 'Typical lists nested inside an object: 100.', + 'array-batch': 'Request batches and result pages: 100 per request, 1,000 in the response that echoes them.', + 'array-large': 'Id, identifier and domain lists that scale with an account or portfolio: 1,000.', + 'array-catalog': 'Catalog-scale payloads (items, records, events, audience members): 10,000.', + 'string-code': 'Short codes and tokens: 64.', + 'string-id': 'Identifiers, names and labels: 255 (the repository default; 262 fields already use it).', + 'string-domain': 'DNS names: 253 (RFC 1035).', + 'string-text': 'Short free text (reasons, messages, descriptions): 2,000 (the repository default for prose).', + 'string-note': 'One-line notes and summaries: 500.', + 'string-url': 'URLs and locators: 2,048.', + 'string-token': 'Opaque tokens, cursors and signatures: 4,096.', + 'string-body': 'Long bodies (markup, scripts, transcripts, briefs): 100,000.', + 'string-blob': 'Encoded binary or inline documents: 1,048,576, the existing markup ceiling.', + 'string-generic': 'No name signal: 500, to be confirmed by the owning working group.', +}; + +// The property name a node is declared under, or the name of the nearest +// enclosing property for items and branches. Keyword segments are told apart +// from property names by position: the segment after `properties` is a name. +const nameOf = pointer => { + const parts = pointer.split('/').slice(1).map(seg => seg.replace(/~1/g, '/').replace(/~0/g, '~')); + let name = ''; + for (let i = 0; i < parts.length; i++) { + const seg = parts[i]; + if (['properties', 'patternProperties', 'definitions', '$defs'].includes(seg) && i + 1 < parts.length) { + name = parts[++i]; + } else if (seg === 'additionalProperties') { + name = name || seg; + } + } + return name; +}; + +function enumSizeOfItems(node, file, docs) { + let items = node.items; + for (let hops = 0; items && typeof items === 'object' && hops < 4; hops++) { + if (Array.isArray(items.enum)) return items.enum.length; + if (items.const !== undefined) return 1; + if (branchesAreClosed(items)) return (items.oneOf || items.anyOf).length; + if (typeof items.$ref !== 'string') return 0; + const target = resolveRef(items.$ref, file, docs); + if (!target) return 0; + items = target.node; + file = target.file; + } + return 0; +} + +// A bound on a type that mixes string or array with another non-null type (for +// example ["integer", "string"]) breaks SDK code generation: it becomes +// z.union([...]).max(N). +function isMixedType(node) { + return Array.isArray(node.type) && node.type.filter(t => t !== 'null').length > 1; +} + +function actionFor(inlineKind, stability, owner, file, pointer, node) { + if (inlineKind) return 'move out of band (4.0)'; + if (stability === 'stable') return 'tighten in 4.0'; + if (owner) return `deferred (${owner})`; + if (WITHDRAWN[`${file}#${pointer}`]) return 'withdrawn (#8501)'; + if (SDK_GENERATION_EXCLUSIONS[`${file}#${pointer}`] || isMixedType(node)) return 'deferred (SDK generation)'; + return 'apply in 3.3'; +} + +const ARRAY_RULES = [ + [/^(errors|warnings|issues|violations|findings|diagnostics|advisories|notices)$/, 'array-typical', 100, 'Diagnostics: more than 100 entries in one payload is a flood, not information.'], + [/(^|_)(records|events|rows|reporting_rows|audience_members|catalog_items|item_availability[a-z_]*)$/, 'array-catalog', 10000, 'Catalog-scale payload; matches the 10,000 ceiling already used for records and events.'], + // Lists drawn from a standard code set: the code set bounds them, as an enum would, so a + // global provider or rights holder is never forced to truncate. Not the 32 for closed vocabularies. + [/(^|_)countries$/, 'array-enum', 256, 'ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.'], + [/(^|_)(languages|locales)$/, 'array-enum', 256, 'ISO 639 / BCP 47 language codes (184 two-letter languages): the code set bounds the list, like an enum.'], + [/(^|_)regions$/, 'array-enum', 1000, 'ISO 3166-2 subdivision codes (about 5,000): 1,000 lets a list name every state or province of several countries.'], + [/(^|_)(signing_keys|encryption_keys|keys|jwks|uids|identifiers|industry_identifiers|names|filters_applied|refinement_applied|[a-z_]*_applied)$/, 'array-small', 32, 'Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.'], + [/(^|_)(tags|labels|keywords|categories|topics|channels|formats|platforms|devices|dimensions|sizes|types|modes|methods|scopes|features|capabilities|protocols|schemes|metrics|breakdowns|dayparts|weekdays|days)$/, 'array-small', 32, 'Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.'], + [/(^|_)(ids|refs|urls|domains|handles|segments_ids|zips|postal_codes|dmas|cities)$/, 'array-large', 1000, 'Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.'], +]; + +// Lists that are the resolved output of a by-reference read or an authoring source. +const ARRAY_FILE_OVERRIDES = { + 'trust/v1/trust-acknowledgements.json#acknowledgements': ['array-catalog', 10000, 'Out-of-band shard for organizations that accept thousands of grants; it must hold more than the 500 allowed inline in trust.json.'], + 'trust/v1/trust.json#grants': ['array-large', 500, 'The description says a record may carry a few hundred inline grants before moving to a URL.'], + 'trust/v1/trust.json#acknowledgements': ['array-large', 500, 'The description says a record may carry a few hundred inline acknowledgements before moving to a URL.'], + 'core/catalog.json#items': ['array-catalog', 10000, 'Inline catalog data; matches the 10,000 ceiling for records. Larger catalogs use url.'], + 'trusted-match/identity-match-request.json#package_ids': ['array-batch', 500, 'All-active mode sends every active package at the publisher, so Identity Match cannot be correlated with Context Match; matches context-match-request package_ids (maxItems 500).'], + 'governance/get-plan-audit-logs-response.json#entries': ['array-catalog', 10000, 'An audit trail grows with the plan and the endpoint has no pagination; matches the 10,000 ceiling for records and events.'], + 'core/product-identity.json#match_keys': ['array-small', 64, 'Per-product override of media_buy.supported_match_keys (maxItems 64); every entry must be covered by a seller-wide one, so the product cap matches the seller-wide cap.'], + 'trusted-match/provider-registration.json#match_keys': ['array-small', 64, 'Same match-key shape and comparison rule as media_buy.supported_match_keys (maxItems 64), so the same cap.'], + 'property/get-property-list-response.json#identifiers': ['array-catalog', 10000, 'Resolved page of a property list read by reference; matches the 10,000 ceiling for records.'], + 'collection/get-collection-list-response.json#identifiers': ['array-catalog', 10000, 'Resolved page of a collection list read by reference; matches the 10,000 ceiling for records.'], +}; + +function proposeArray(node, file, pointer, side, docs, markedPaged) { + const enumSize = enumSizeOfItems(node, file, docs); + if (enumSize > 0) { + return { tier: 'array-enum', limit: Math.max(32, enumSize), rationale: `Enum-valued items (${enumSize} values), so the enum bounds it; 32 floor.` }; + } + const name = nameOf(pointer); + const override = ARRAY_FILE_OVERRIDES[`${file}#${name}`]; + if (override) return { tier: override[0], limit: override[1], rationale: override[2] }; + for (const [re, tier, limit, rationale] of ARRAY_RULES) { + if (re.test(name)) { + if (tier === 'array-large' && side === 'request') { + return { tier: 'array-batch', limit: 100, rationale: 'Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.' }; + } + return { tier, limit, rationale }; + } + } + if (markedPaged) return { tier: 'array-batch', limit: 1000, rationale: 'Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.' }; + if (side === 'request') return { tier: 'array-batch', limit: 100, rationale: 'Request batch or nested list; 100 matches creative_ids, accounts and changes.' }; + return { tier: 'array-typical', limit: 100, rationale: 'Typical nested list; 100 until the owning group names a real ceiling.' }; +} + +const STRING_RULES = [ + [/(^|_)(content|markup|html|transcript|script|brief|prompt|template|css|js|vast|daast|xml|text_content)$|^(body|document)$/, 'string-body', 100000, 'Long-form body; matches content (100,000) and transcript (200,000) already in the schemas.'], + [/(^|_)(blob|data|payload|encoded|base64|binary|attachment|file_content)$/, 'string-blob', 1048576, 'Encoded or inline document; capped at the 1 MiB markup ceiling.'], + [/(^|_)(url|uri|href|endpoint|location|link|webhook|callback|origin|agent_url|image_url|click_url|impression_url)s?$/, 'string-url', 2048, 'URL-shaped value; 2,048 is the repository default and the common browser limit.'], + [/(^|_)(domain|hostname|host|publisher_domain|subdomain)$/, 'string-domain', 253, 'DNS name, at most 253 octets (RFC 1035).'], + [/(^|_)(cursor|token|signature|jws|jwt|credentials?|secret|nonce|etag|digest|hash|sha256|public_key|certificate)$/, 'string-token', 4096, 'Opaque token; 4,096 matches cursor and token fields already bounded.'], + [/(^|_)(description|message|reason|reasons|detail|details|explanation|instructions|rationale|justification|comment|comments|notes?|remediation|suggestion|guidance|policy|terms|disclaimer|caption|alt_text|body_text|copy|headline|title|subject|question|query|text|summary|definition|usage|criteria|condition)$/, 'string-text', 2000, 'Prose for a human or model; 2,000 is the repository default (41 fields).'], + [/(^|_)(code|currency|country|region|language|locale|timezone|unit|version|namespace|tag|postal_code)$/, 'string-code', 64, 'Short code or version; 64 covers every registered value with room.'], + [/(^|_)(id|ids|ref|key|name|label|slug|handle|identifier|uid|sku|gtin|isbn|brand|advertiser|operator|owner|agent|seller|buyer|publisher|vendor|campaign|platform|source|destination|account|property|product|package|creative|asset|segment|signal|audience|catalog|feed|list|plan|task|session|trace|request|correlation|idempotency|context|reference)(_[a-z0-9]+)*$/, 'string-id', 255, 'Identifier or name; 255 is the repository default (262 fields).'], +]; + +// Field-specific limits that the name rules cannot infer. Keyed by property name. +const STRING_OVERRIDES = { + $schema: ['string-url', 2048, 'JSON Schema URI.'], + us_privacy: ['string-code', 16, 'IAB US Privacy string is 4 characters; 16 leaves room for a future revision.'], + tcf_consent: ['string-token', 4096, 'IAB TCF consent string; real strings run to a few KB.'], + gpp: ['string-token', 4096, 'IAB GPP string; bounded like other consent strings.'], + tmpx: ['string-token', 4096, 'Opaque exposure token.'], + embedding: ['string-blob', 65536, 'Encoded embedding vector.'], + phone: ['string-code', 30, 'Matches the phone fields already bounded at 30.'], + street: ['string-id', 200, 'Matches street fields already bounded at 200.'], + city: ['string-id', 100, 'City name.'], + state: ['string-id', 100, 'State or region name.'], + tagline: ['string-id', 255, 'One-line marketing text.'], + subtitle: ['string-id', 255, 'One-line marketing text.'], + badge: ['string-id', 255, 'One-line marketing text.'], + alt: ['string-text', 2000, 'Alternative text for assets, like other prose.'], + price: ['string-code', 64, 'Formatted price for display.'], + original_price: ['string-code', 64, 'Formatted price for display.'], + price_hint: ['string-code', 64, 'Formatted price for display.'], + locator: ['string-url', 2048, 'Locator, bounded like other URL-shaped values.'], + line1: ['string-id', 200, 'Street line; matches street fields already bounded at 200.'], + reach_methodology: ['string-text', 2000, 'Human-readable methodology, like other prose.'], + position_delivered: ['string-id', 255, 'Short free-form position label.'], + season: ['string-code', 64, 'Season identifier.'], + installment_number: ['string-code', 64, 'Installment number within a season.'], + collections_version: ['string-id', 255, 'Opaque version token; its length is the issuer\'s choice.'], + if_collections_version: ['string-id', 255, 'Echo of an opaque version token.'], + governance_context: ['string-token', 4096, 'Signed governance context (a JWS); matches the 4,096 already on every request that carries it.'], + governance_contexts: ['string-token', 4096, 'Signed governance contexts (JWS); matches the 4,096 already on every request that carries one.'], + accrediting_body: ['string-id', 255, 'Name of an accrediting body.'], + canonical_utf8_base64: ['string-blob', 1048576, 'Base64 of a canonical document; 1 MiB matches the markup ceiling.'], + creative_data: ['string-blob', 1048576, 'Inline creative data; 1 MiB matches the markup ceiling.'], + intent: ['string-id', 255, 'Short intent label.'], + action: ['string-id', 255, 'Action name.'], + value: ['string-id', 255, 'Scalar value; 255 is the repository default for short values.'], +}; + +const singular = name => name.replace(/_(include|exclude|evaluated|supported|allowed)$/, '').replace(/ies$/, 'y').replace(/(ches|shes|sses)$/, m => m.slice(0, -2)).replace(/s$/, ''); + +function proposeString(node, pointer, description) { + const name = nameOf(pointer); + if (STRING_OVERRIDES[name]) { + const [tier, limit, rationale] = STRING_OVERRIDES[name]; + return { tier, limit, rationale }; + } + if (/ISO 8601 duration|IETF BCP 47|ISO 4217|ISO 3166|IANA time ?zone/i.test(description || '')) { + return { tier: 'string-code', limit: 64, rationale: 'Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.' }; + } + const isItem = /\/items$/.test(pointer); + const candidates = isItem ? [singular(name), name] : [name]; + for (const candidate of candidates) { + for (const [re, tier, limit, rationale] of STRING_RULES) { + if (re.test(candidate)) return { tier, limit, rationale }; + } + } + if (typeof node.pattern === 'string') return { tier: 'string-id', limit: 255, rationale: 'Pattern-constrained but unbounded value; 255 is the repository default.' }; + return { tier: 'string-generic', limit: 500, rationale: TIERS['string-generic'] }; +} + +// --------------------------------------------------------------------------- +// Inline property and collection lists +// --------------------------------------------------------------------------- + +// Arrays that carry a property or collection list inline. Matching is by field +// name because the same item shapes (domains, ids) also appear in fields that +// are not lists passed between agents (asset requirements, tag vocabularies). +const INLINE_LIST_NAMES = { + property: /^(properties|publisher_properties|property_ids|property_tags|base_properties|publisher_domains|data_provider_domains|revoked_publisher_domains|publishers|removed_from_publishers|applies_to_property_ids|applies_to_property_tags)$/, + collection: /^(collections|base_collections)$/, +}; + +// Where the inline list sits decides what moving it out of band means. +function inlineCarriage(file, side) { + if (/^(adagents\.json|brand\.json|aao\/|core\/registry-event\.json)/.test(file)) return 'document'; + if (/(^|\/)((create|update)-(property|collection)-list-request|(property|collection)-list|base-(property|collection)-source|(property|collection)-list-filters|get-(property|collection)-list-response)\.json$/.test(file)) return 'list-authoring'; + if (/(^|\/)(publisher-property-selector|collection-selection|collection-selector)\.json$/.test(file)) return 'selector'; + return side === 'request' ? 'request-field' : 'response-field'; +} + +// Direct identifier enumerations, which the name rules above cannot tell from +// the identifiers of a single property. +const INLINE_LIST_FILE_FIELDS = { + 'property/base-property-source.json#identifiers': 'property', + 'property/property-list-filters.json#exclude_identifiers': 'property', + 'collection/base-collection-source.json#identifiers': 'collection', + 'collection/collection-list-filters.json#exclude_distribution_ids': 'collection', +}; + +// The resolved page of a list read by reference is the by-reference data plane, not an inline list. +const INLINE_LIST_EXEMPT = new Set(['collection/get-collection-list-response.json#collections']); + +function inlineListKind(node, file, pointer) { + if (!typeIncludes(node, 'array')) return null; + const name = nameOf(pointer); + if (INLINE_LIST_EXEMPT.has(`${file}#${name}`)) return null; + if (INLINE_LIST_FILE_FIELDS[`${file}#${name}`]) return INLINE_LIST_FILE_FIELDS[`${file}#${name}`]; + for (const [kind, re] of Object.entries(INLINE_LIST_NAMES)) if (re.test(name)) return kind; + return null; +} + +// --------------------------------------------------------------------------- +// Build +// --------------------------------------------------------------------------- + +function loadDocs(dir) { + const docs = new Map(); + if (!fs.existsSync(dir)) return docs; + for (const file of listJson(dir)) { + try { + docs.set(file, JSON.parse(fs.readFileSync(path.join(dir, file), 'utf8'))); + } catch (err) { + throw new Error(`${file}: ${err.message}`); + } + } + return docs; +} + +function build({ sourceDir = SOURCE_DIR, distDir = DIST_DIR } = {}) { + const docs = loadDocs(sourceDir); + const lastStable = lastStableRelease(distDir); + const lastStableDocs = lastStable ? loadDocs(path.join(distDir, lastStable)) : new Map(); + const { reached, unresolved } = traceSides(docs); + const inbound = buildInboundIndex(docs); + const wireMemo = new Map(); + // A node reachable from a file another workstream owns shares that file's size budget, + // so a bound on it changes the owner's documented figures. + const ownedKeys = new Map(); + for (const [root, owner] of Object.entries(OWNED_ELSEWHERE)) { + for (const key of reachableFrom(docs, root)) if (!ownedKeys.has(key)) ownedKeys.set(key, owner); + } + const ownerOf = (file, pointer) => ownedKeys.get(`${file}#${pointer}`); + + const entries = []; + const inline = []; + const skipped = { array: 0, string: {} }; + const unboundedUri = []; + const seen = new Set(); + const files = [...docs.keys()].sort(); + + for (const file of files) { + walkSchemas(docs.get(file), '', (node, pointer, ancestors) => { + seen.add(`${file}#${pointer}`); + const sides = reached.get(`${file}#${pointer}`); + const side = sides ? (sides.has('request') && sides.has('response') ? 'both' : sides.has('request') ? 'request' : 'response') : 'other'; + const stab = stabilityOf(file, pointer, ancestors, node, lastStableDocs, inbound, wireMemo); + const parent = ancestors[ancestors.length - 1]; + const siblingProps = parent && parent.properties ? Object.keys(parent.properties) : []; + const grand = ancestors[ancestors.length - 2]; + + if (typeIncludes(node, 'array')) { + const kind = inlineListKind(node, file, pointer); + if (kind) { + inline.push({ + file, + pointer, + list_kind: kind, + carriage: inlineCarriage(file, side), + side, + stability: stab.stability, + bounded: typeof node.maxItems === 'number', + max_items: typeof node.maxItems === 'number' ? node.maxItems : null, + }); + } + if (typeof node.maxItems === 'number') { + skipped.array++; + return; + } + const paged = siblingProps.includes('pagination') || (grand && grand.properties && Object.keys(grand.properties).includes('pagination')); + const proposal = proposeArray(node, file, pointer, side, docs, paged && side !== 'request'); + entries.push({ + file, + pointer, + kind: 'array', + property: nameOf(pointer), + side, + stability: stab.stability, + added_in_3_3: stab.markedNew || undefined, + newness_derived_from_refs: stab.derived || undefined, + in_last_stable: stab.inLastStable, + marker_conflict: stab.markerConflict || undefined, + items: typeof node.items === 'object' && node.items ? (node.items.$ref ? `$ref ${node.items.$ref}` : node.items.type || 'schema') : 'untyped', + proposed_limit: kind ? null : proposal.limit, + tier: kind ? 'inline-property-list' : proposal.tier, + rationale: kind ? 'Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).' : proposal.rationale, + action: actionFor(kind, stab.stability, ownerOf(file, pointer), file, pointer, node), + }); + } else if (typeIncludes(node, 'string')) { + const reason = stringSkipReason(node); + if (reason === 'format:uri' && typeof node.maxLength !== 'number') unboundedUri.push(`${file}#${pointer}`); + if (reason) { + skipped.string[reason] = (skipped.string[reason] || 0) + 1; + return; + } + const proposal = proposeString(node, pointer, node.description); + entries.push({ + file, + pointer, + kind: 'string', + property: nameOf(pointer), + side, + stability: stab.stability, + added_in_3_3: stab.markedNew || undefined, + newness_derived_from_refs: stab.derived || undefined, + in_last_stable: stab.inLastStable, + marker_conflict: stab.markerConflict || undefined, + ...(node.format ? { format: node.format } : {}), + ...(node.pattern ? { pattern: node.pattern } : {}), + proposed_limit: proposal.limit, + tier: proposal.tier, + rationale: proposal.rationale, + action: actionFor(null, stab.stability, ownerOf(file, pointer), file, pointer, node), + }); + } + }); + } + + const summary = summarize(entries, inline); + return { + meta: { + schema_version: JSON.parse(fs.readFileSync(path.join(REPO_ROOT, 'package.json'), 'utf8')).version, + last_stable_release: lastStable, + source_files: files.length, + already_bounded_arrays: skipped.array, + skipped_strings: skipped.string, + unbounded_uri_strings: unboundedUri.length, + unresolved_refs: [...unresolved].sort(), + // Exclusions whose node is gone, for example after a withdrawal PR merges: delete them. + stale_exclusions: Object.keys({ ...SDK_GENERATION_EXCLUSIONS, ...WITHDRAWN }).filter(key => !seen.has(key)).sort(), + ordering: 'file, then pointer', + }, + tiers: TIERS, + summary, + inline_property_lists: inline, + entries, + unbounded_uri_strings: unboundedUri.sort(), + }; +} + +function summarize(entries, inline) { + const count = (list, keyFn) => { + const out = {}; + for (const e of list) { + const k = keyFn(e); + out[k] = (out[k] || 0) + 1; + } + return Object.fromEntries(Object.entries(out).sort(([a], [b]) => a.localeCompare(b))); + }; + const byKind = {}; + for (const kind of ['array', 'string']) { + const subset = entries.filter(e => e.kind === kind); + byKind[kind] = { + total: subset.length, + files: new Set(subset.map(e => e.file)).size, + by_stability: count(subset, e => e.stability), + by_side: count(subset, e => e.side), + by_stability_and_side: count(subset, e => `${e.stability}/${e.side}`), + by_tier: count(subset, e => e.tier), + by_action: count(subset, e => e.action), + }; + } + return { + ...byKind, + inline_property_lists: { total: inline.length, by_kind: count(inline, e => e.list_kind), by_stability: count(inline, e => e.stability), unbounded: inline.filter(e => !e.bounded).length }, + }; +} + +// --------------------------------------------------------------------------- +// Applying the 3.3 slice +// --------------------------------------------------------------------------- +// +// A bound goes into the schema text right after the node's `type`, so the rest +// of the file keeps its formatting: `"type": "array",\n"maxItems": 100` +// in a multi-line object, `{ "type": "string", "maxLength": 255 }` in an inline one. + +/** Parses JSON text into {kind, start, end} nodes; objects keep {keyStart, value} per member. */ +function parseWithOffsets(text) { + let i = 0; + const ws = () => { + while (i < text.length && /\s/.test(text[i])) i++; + }; + const expect = ch => { + if (text[i] !== ch) throw new Error(`expected '${ch}' at offset ${i}`); + i++; + }; + const skipString = () => { + let j = i + 1; + while (text[j] !== '"') j += text[j] === '\\' ? 2 : 1; + i = j + 1; + }; + const value = () => { + ws(); + const start = i; + if (text[i] === '{') { + i++; + const members = new Map(); + ws(); + if (text[i] !== '}') { + for (;;) { + ws(); + const keyStart = i; + skipString(); + const key = JSON.parse(text.slice(keyStart, i)); + ws(); + expect(':'); + members.set(key, { keyStart, value: value() }); + ws(); + if (text[i] !== ',') break; + i++; + } + } + expect('}'); + return { kind: 'object', start, end: i, members }; + } + if (text[i] === '[') { + i++; + const elements = []; + ws(); + if (text[i] !== ']') { + for (;;) { + elements.push(value()); + ws(); + if (text[i] !== ',') break; + i++; + } + } + expect(']'); + return { kind: 'array', start, end: i, elements }; + } + if (text[i] === '"') skipString(); + else while (i < text.length && !/[\s,\]}]/.test(text[i])) i++; + return { kind: 'scalar', start, end: i }; + }; + return value(); +} + +function nodeAt(root, pointer) { + let node = root; + for (const raw of pointer.split('/').slice(1)) { + const seg = raw.replace(/~1/g, '/').replace(/~0/g, '~'); + node = node.kind === 'object' ? node.members.get(seg)?.value : node.kind === 'array' ? node.elements[Number(seg)] : undefined; + if (!node) throw new Error(`no node at ${pointer}`); + } + return node; +} + +const boundKeyword = entry => (entry.kind === 'array' ? 'maxItems' : 'maxLength'); + +/** Adds every "apply in 3.3" bound in the inventory to the schema files; returns what it added. */ +function applyBounds(inventory, sourceDir) { + const open = inventory.entries.filter(e => e.action === 'apply in 3.3'); + const applied = []; + for (const file of [...new Set(open.map(e => e.file))]) { + const full = path.join(sourceDir, file); + const original = fs.readFileSync(full, 'utf8'); + const root = parseWithOffsets(original); + const expected = JSON.parse(original); + const edits = []; + for (const entry of open.filter(e => e.file === file)) { + const keyword = boundKeyword(entry); + const node = nodeAt(root, entry.pointer); + const type = node.members && node.members.get('type'); + if (!type || node.members.has(keyword)) throw new Error(`${file}#${entry.pointer}: expected a type and no ${keyword}`); + const lineStart = original.lastIndexOf('\n', type.keyStart - 1) + 1; + const lead = original.slice(lineStart, type.keyStart); + const insert = /^\s*$/.test(lead) ? `,\n${lead}"${keyword}": ${entry.proposed_limit}` : `, "${keyword}": ${entry.proposed_limit}`; + edits.push({ at: type.value.end, insert }); + getPointer(expected, entry.pointer)[keyword] = entry.proposed_limit; + applied.push({ file, pointer: entry.pointer, keyword, limit: entry.proposed_limit, stability: entry.stability, tier: entry.tier }); + } + let text = original; + for (const { at, insert } of edits.sort((a, b) => b.at - a.at)) text = text.slice(0, at) + insert + text.slice(at); + // The edit must change nothing but the added keywords. + assert.deepEqual(JSON.parse(text), expected, `${file}: applying bounds changed more than the bounds`); + fs.writeFileSync(full, text); + } + return applied; +} + +/** + * The slice file lists every bound this change added. A rerun adds what it just + * applied and keeps earlier records whose bound is still in the source, so it can + * be rerun after taking main's copy of a conflicting schema. + */ +function updateSlice(applied, sourceDir, slicePath) { + const key = r => `${r.file}#${r.pointer}#${r.keyword}`; + let prior = []; + try { + prior = JSON.parse(fs.readFileSync(slicePath, 'utf8')).applied; + } catch (err) { + if (err.code !== 'ENOENT') throw err; + } + const records = new Map(); + for (const r of [...prior, ...applied]) records.set(key(r), r); + const docs = loadDocs(sourceDir); + const kept = [...records.values()] + .filter(r => { + const node = docs.has(r.file) ? getPointer(docs.get(r.file), r.pointer) : undefined; + return node && node[r.keyword] === r.limit; + }) + .sort((a, b) => (key(a) < key(b) ? -1 : key(a) > key(b) ? 1 : 0)); + const head = { + description: 'Bounds added by the 3.3 slice: arrays and strings that are new in 3.3 or experimental. Written by `node scripts/audit-schema-bounds.cjs --apply`; scripts/schema-bounds-inventory.json describes the tree after these edits.', + count: kept.length, + }; + const body = kept.map(r => ` ${JSON.stringify(r)}`).join(',\n'); + fs.writeFileSync(slicePath, `${JSON.stringify(head, null, 2).replace(/\n}$/, '')},\n "applied": [\n${body}\n ]\n}\n`); + return kept; +} + +/** Applies the open bounds, records them in the slice file and rewrites the inventory. */ +function apply({ sourceDir = SOURCE_DIR, distDir = DIST_DIR, slicePath = SLICE_PATH, inventoryPath = INVENTORY_PATH } = {}) { + const applied = applyBounds(build({ sourceDir, distDir }), sourceDir); + const slice = updateSlice(applied, sourceDir, slicePath); + const inventory = build({ sourceDir, distDir }); + fs.writeFileSync(inventoryPath, render(inventory)); + return { applied, slice, inventory }; +} + +function render(inventory) { + // One entry per line keeps the committed file reviewable and diffable. + const { entries, inline_property_lists: inline, ...rest } = inventory; + const head = JSON.stringify(rest, null, 2).replace(/\n}$/, ''); + const lines = (list) => list.map(e => ` ${JSON.stringify(e)}`).join(',\n'); + return `${head},\n "inline_property_lists": [\n${lines(inline)}\n ],\n "entries": [\n${lines(entries)}\n ]\n}\n`; +} + +function printSummary(inventory) { + const s = inventory.summary; + const out = []; + for (const kind of ['array', 'string']) { + const k = s[kind]; + out.push(`Unbounded ${kind}s: ${k.total} in ${k.files} files`); + out.push(` by stability: ${JSON.stringify(k.by_stability)}`); + out.push(` by side: ${JSON.stringify(k.by_side)}`); + out.push(` by action: ${JSON.stringify(k.by_action)}`); + } + out.push(`Inline property/collection lists: ${s.inline_property_lists.total} (${s.inline_property_lists.unbounded} unbounded) ${JSON.stringify(s.inline_property_lists.by_kind)}`); + out.push(`Unbounded uri-format strings (skipped by the task rules, not length-bounded): ${inventory.meta.unbounded_uri_strings}`); + const conflicts = inventory.entries.filter(e => e.marker_conflict).length; + if (conflicts) out.push(`x-added-in markers that conflict with ${inventory.meta.last_stable_release} (treated as stable): ${conflicts}`); + for (const key of inventory.meta.stale_exclusions) out.push(`Exclusion for a node that no longer exists (delete it from the script): ${key}`); + process.stdout.write(out.join('\n') + '\n'); +} + +function main() { + const args = new Set(process.argv.slice(2)); + if (args.has('--apply')) { + const { applied, slice, inventory } = apply(); + console.log(`Added ${applied.length} bound(s) in ${new Set(applied.map(r => r.file)).size} file(s); the slice now lists ${slice.length} in ${new Set(slice.map(r => r.file)).size} file(s).`); + printSummary(inventory); + return; + } + const inventory = build(); + if (args.has('--json')) { + process.stdout.write(render(inventory)); + return; + } + if (args.has('--write')) { + fs.writeFileSync(INVENTORY_PATH, render(inventory)); + printSummary(inventory); + return; + } + if (args.has('--check') || args.has('--check-unreleased')) { + let failed = false; + if (args.has('--check')) { + const committed = fs.existsSync(INVENTORY_PATH) ? fs.readFileSync(INVENTORY_PATH, 'utf8') : ''; + if (committed !== render(inventory)) { + console.error('scripts/schema-bounds-inventory.json is stale. Run: node scripts/audit-schema-bounds.cjs --write'); + failed = true; + } + } + if (args.has('--check-unreleased')) { + const open = inventory.entries.filter(e => e.action === 'apply in 3.3'); + if (open.length) { + console.error(`${open.length} unbounded array(s) or string(s) are new in 3.3 or experimental. Add maxItems/maxLength:`); + for (const e of open.slice(0, 50)) console.error(` ${e.file}#${e.pointer} (${e.kind}, ${e.stability}) -> ${e.proposed_limit}`); + console.error('Run `node scripts/audit-schema-bounds.cjs --apply` to add the proposed bounds, or record an exclusion with its reason in the script.'); + failed = true; + } + } + if (failed) process.exit(1); + console.log('schema bounds inventory ok'); + return; + } + printSummary(inventory); +} + +if (require.main === module) main(); + +module.exports = { build, render, apply, isBoundedPattern }; diff --git a/scripts/schema-bounds-3-3-slice.json b/scripts/schema-bounds-3-3-slice.json new file mode 100644 index 00000000000..7bb98ddb61d --- /dev/null +++ b/scripts/schema-bounds-3-3-slice.json @@ -0,0 +1,654 @@ +{ + "description": "Bounds added by the 3.3 slice: arrays and strings that are new in 3.3 or experimental. Written by `node scripts/audit-schema-bounds.cjs --apply`; scripts/schema-bounds-inventory.json describes the tree after these edits.", + "count": 648, + "applied": [ + {"file":"account/get-account-financials-response.json","pointer":"/oneOf/0/properties/invoices/items/properties/adjusts_invoice_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"account/get-account-financials-response.json","pointer":"/oneOf/0/properties/invoices/items/properties/lines","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"account/list-account-changes-response.json","pointer":"/properties/errors","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"account/request-account-request.json","pointer":"/properties/account_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"account/request-account-request.json","pointer":"/properties/operator","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"account/request-account-request.json","pointer":"/properties/timezone","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"account/request-account-response.json","pointer":"/properties/errors","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/collections/items/properties/publisher_domain","keyword":"maxLength","limit":253,"stability":"experimental","tier":"string-domain"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/prohibited_terms","keyword":"maxItems","limit":100,"stability":"new-3.3","tier":"array-typical"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/prohibited_terms/items","keyword":"maxLength","limit":2000,"stability":"new-3.3","tier":"string-text"}, + {"file":"brand/acquire-rights-request.json","pointer":"/properties/campaign/properties/countries","keyword":"maxItems","limit":256,"stability":"experimental","tier":"array-enum"}, + {"file":"brand/acquire-rights-request.json","pointer":"/properties/campaign/properties/description","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"brand/acquire-rights-request.json","pointer":"/properties/campaign/properties/format_ids","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"brand/acquire-rights-request.json","pointer":"/properties/campaign/properties/format_kinds","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"brand/acquire-rights-request.json","pointer":"/properties/campaign/properties/format_option_refs","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"brand/acquire-rights-request.json","pointer":"/properties/campaign/properties/uses","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"brand/acquire-rights-request.json","pointer":"/properties/pricing_option_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/acquire-rights-request.json","pointer":"/properties/rights_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/acquire-rights-response.json","pointer":"/oneOf/0/properties/brand_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/acquire-rights-response.json","pointer":"/oneOf/0/properties/disclosure/properties/text","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"brand/acquire-rights-response.json","pointer":"/oneOf/0/properties/generation_credentials","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"brand/acquire-rights-response.json","pointer":"/oneOf/0/properties/restrictions","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"brand/acquire-rights-response.json","pointer":"/oneOf/0/properties/restrictions/items","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"brand/acquire-rights-response.json","pointer":"/oneOf/0/properties/rights_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/acquire-rights-response.json","pointer":"/oneOf/1/properties/brand_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/acquire-rights-response.json","pointer":"/oneOf/1/properties/detail","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"brand/acquire-rights-response.json","pointer":"/oneOf/1/properties/estimated_response_time","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"brand/acquire-rights-response.json","pointer":"/oneOf/1/properties/rights_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/acquire-rights-response.json","pointer":"/oneOf/2/properties/brand_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/acquire-rights-response.json","pointer":"/oneOf/2/properties/reason","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"brand/acquire-rights-response.json","pointer":"/oneOf/2/properties/rights_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/acquire-rights-response.json","pointer":"/oneOf/2/properties/suggestions","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"brand/acquire-rights-response.json","pointer":"/oneOf/2/properties/suggestions/items","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"brand/acquire-rights-response.json","pointer":"/oneOf/3/properties/errors","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/collections/items/properties/collection_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/collections/items/properties/name","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/collections/items/properties/publisher_domain","keyword":"maxLength","limit":253,"stability":"experimental","tier":"string-domain"}, + {"file":"brand/get-rights-request.json","pointer":"/properties/brand_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/get-rights-request.json","pointer":"/properties/countries","keyword":"maxItems","limit":256,"stability":"experimental","tier":"array-enum"}, + {"file":"brand/get-rights-request.json","pointer":"/properties/uses","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/excluded","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/excluded/items/properties/brand_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/excluded/items/properties/name","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/excluded/items/properties/reason","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/excluded/items/properties/suggestions","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/excluded/items/properties/suggestions/items","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/rights","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/rights/items/properties/available_uses","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/rights/items/properties/brand_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/rights/items/properties/content_restrictions","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/rights/items/properties/content_restrictions/items","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/rights/items/properties/countries","keyword":"maxItems","limit":256,"stability":"experimental","tier":"array-enum"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/rights/items/properties/description","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/rights/items/properties/excluded_countries","keyword":"maxItems","limit":256,"stability":"experimental","tier":"array-enum"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/rights/items/properties/exclusivity_status/properties/existing_exclusives","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/rights/items/properties/exclusivity_status/properties/existing_exclusives/items","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/rights/items/properties/match_reasons","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/rights/items/properties/match_reasons/items","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/rights/items/properties/name","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/rights/items/properties/preview_assets","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/rights/items/properties/preview_assets/items/properties/usage","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/rights/items/properties/pricing_options","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/0/properties/rights/items/properties/rights_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/get-rights-response.json","pointer":"/oneOf/1/properties/errors","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"brand/rights-pricing-option.json","pointer":"/properties/description","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"brand/rights-pricing-option.json","pointer":"/properties/pricing_option_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/rights-pricing-option.json","pointer":"/properties/uses","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"brand/rights-terms.json","pointer":"/properties/exclusivity/properties/countries","keyword":"maxItems","limit":256,"stability":"experimental","tier":"array-enum"}, + {"file":"brand/rights-terms.json","pointer":"/properties/exclusivity/properties/scope","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"brand/rights-terms.json","pointer":"/properties/pricing_option_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/rights-terms.json","pointer":"/properties/uses","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"brand/search-brands-request.json","pointer":"/properties/countries","keyword":"maxItems","limit":256,"stability":"experimental","tier":"array-enum"}, + {"file":"brand/search-brands-request.json","pointer":"/properties/industries","keyword":"maxItems","limit":81,"stability":"experimental","tier":"array-enum"}, + {"file":"brand/search-brands-response.json","pointer":"/definitions/SearchBrandResult/properties/brand_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/search-brands-response.json","pointer":"/definitions/SearchBrandResult/properties/claimed_house_domain","keyword":"maxLength","limit":253,"stability":"experimental","tier":"string-domain"}, + {"file":"brand/search-brands-response.json","pointer":"/definitions/SearchBrandResult/properties/description","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"brand/search-brands-response.json","pointer":"/definitions/SearchBrandResult/properties/house/properties/domain","keyword":"maxLength","limit":253,"stability":"experimental","tier":"string-domain"}, + {"file":"brand/search-brands-response.json","pointer":"/definitions/SearchBrandResult/properties/house/properties/name","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/search-brands-response.json","pointer":"/definitions/SearchBrandResult/properties/industries","keyword":"maxItems","limit":81,"stability":"experimental","tier":"array-enum"}, + {"file":"brand/search-brands-response.json","pointer":"/definitions/SearchBrandResult/properties/logos","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"brand/search-brands-response.json","pointer":"/definitions/SearchBrandResult/properties/names","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-small"}, + {"file":"brand/search-brands-response.json","pointer":"/definitions/SearchBrandResult/properties/names/items/additionalProperties","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"brand/search-brands-response.json","pointer":"/definitions/SearchBrandResult/properties/rights/properties/available_uses","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"brand/search-brands-response.json","pointer":"/definitions/SearchBrandResult/properties/rights/properties/countries","keyword":"maxItems","limit":256,"stability":"experimental","tier":"array-enum"}, + {"file":"brand/search-brands-response.json","pointer":"/definitions/SearchBrandResult/properties/rights/properties/excluded_countries","keyword":"maxItems","limit":256,"stability":"experimental","tier":"array-enum"}, + {"file":"brand/search-brands-response.json","pointer":"/oneOf/0/properties/brands","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-batch"}, + {"file":"brand/search-brands-response.json","pointer":"/oneOf/1/properties/errors","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"brand/update-rights-request.json","pointer":"/properties/pricing_option_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/update-rights-request.json","pointer":"/properties/rights_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/update-rights-response.json","pointer":"/oneOf/0/properties/rights_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"brand/update-rights-response.json","pointer":"/oneOf/1/properties/errors","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/installment_delivery","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"compliance/comply-test-controller-response.json","pointer":"/definitions/SetAccountTimezoneResult/properties/account_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"compliance/comply-test-controller-response.json","pointer":"/definitions/SetAccountTimezoneResult/properties/timezone_cutovers","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/account-candidate.json","pointer":"/properties/account_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/account-candidate.json","pointer":"/properties/name","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/account-candidate.json","pointer":"/properties/operator","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/account-request-record.json","pointer":"/properties/account_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/account-request-record.json","pointer":"/properties/errors","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/account-request-record.json","pointer":"/properties/requested/properties/account_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/account-request-record.json","pointer":"/properties/requested/properties/operator","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/account-request-record.json","pointer":"/properties/requested/properties/timezone","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"core/agent-reporting-destination.json","pointer":"/oneOf/0/properties/accepted_formats","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"core/assets/display-tag-asset.json","pointer":"/properties/sizes","keyword":"maxItems","limit":32,"stability":"new-3.3","tier":"array-small"}, + {"file":"core/assets/html-asset.json","pointer":"/properties/sizes","keyword":"maxItems","limit":32,"stability":"new-3.3","tier":"array-small"}, + {"file":"core/assets/zip-asset.json","pointer":"/properties/sizes","keyword":"maxItems","limit":32,"stability":"new-3.3","tier":"array-small"}, + {"file":"core/assignment-tracker.json","pointer":"/properties/custom_event_name","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"core/buyer-onboarding-posture.json","pointer":"/properties/message","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"core/buyer-onboarding-posture.json","pointer":"/properties/requirements","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/canonical-installment.json","pointer":"/properties/guest_talent","keyword":"maxItems","limit":100,"stability":"new-3.3","tier":"array-typical"}, + {"file":"core/canonical-installment.json","pointer":"/properties/installment_id","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"core/canonical-installment.json","pointer":"/properties/installment_number","keyword":"maxLength","limit":64,"stability":"new-3.3","tier":"string-code"}, + {"file":"core/canonical-installment.json","pointer":"/properties/name","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"core/canonical-installment.json","pointer":"/properties/season","keyword":"maxLength","limit":64,"stability":"new-3.3","tier":"string-code"}, + {"file":"core/canonical-installment.json","pointer":"/properties/topics","keyword":"maxItems","limit":32,"stability":"new-3.3","tier":"array-small"}, + {"file":"core/canonical-installment.json","pointer":"/properties/topics/items","keyword":"maxLength","limit":500,"stability":"new-3.3","tier":"string-generic"}, + {"file":"core/canonical-placement.json","pointer":"/definitions/CanonicalDoohAddress/properties/city","keyword":"maxLength","limit":100,"stability":"new-3.3","tier":"string-id"}, + {"file":"core/canonical-placement.json","pointer":"/definitions/CanonicalDoohAddress/properties/line1","keyword":"maxLength","limit":200,"stability":"new-3.3","tier":"string-id"}, + {"file":"core/canonical-placement.json","pointer":"/definitions/CanonicalDoohAddress/properties/postal_code","keyword":"maxLength","limit":64,"stability":"new-3.3","tier":"string-code"}, + {"file":"core/canonical-placement.json","pointer":"/definitions/CanonicalDoohAddress/properties/region","keyword":"maxLength","limit":64,"stability":"new-3.3","tier":"string-code"}, + {"file":"core/canonical-projection-ref.json","pointer":"/properties/supported_delivery_types","keyword":"maxItems","limit":32,"stability":"new-3.3","tier":"array-enum"}, + {"file":"core/canonical-proposal.json","pointer":"/properties/holds","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/canonical-proposal.json","pointer":"/properties/holds/items/properties/product_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/creative-staged-update.json","pointer":"/properties/change_kinds","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"core/creative-staged-update.json","pointer":"/properties/rejection_reason","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"core/delivery-metrics.json","pointer":"/properties/ooh_metrics/properties/calculation_notes","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"core/delivery-metrics.json","pointer":"/properties/ooh_metrics/properties/panels","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/delivery-metrics.json","pointer":"/properties/ooh_metrics/properties/panels/items/properties/identifiers","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-small"}, + {"file":"core/delivery-metrics.json","pointer":"/properties/ooh_metrics/properties/panels/items/properties/identifiers/items/properties/id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/delivery-metrics.json","pointer":"/properties/ooh_metrics/properties/panels/items/properties/name","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/delivery-metrics.json","pointer":"/properties/ooh_metrics/properties/postings","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/delivery-metrics.json","pointer":"/properties/ooh_metrics/properties/postings/items/properties/panel_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/delivery-metrics.json","pointer":"/properties/print_metrics/properties/position_delivered","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/delivery-metrics.json","pointer":"/properties/vendor_metric_provenance","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/demographic-gender.json","pointer":"/properties/values","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"core/demographic-targeting-capability.json","pointer":"/properties/gender/properties/execution_modes","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"core/demographic-targeting-capability.json","pointer":"/properties/gender/properties/values","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"core/demographic-targeting-resolution.json","pointer":"/properties/execution/oneOf/4/properties/age/oneOf/1/properties/interval_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"core/demographic-targeting-resolution.json","pointer":"/properties/execution/oneOf/4/properties/age/oneOf/1/properties/interval_ids/items","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/demographic-targeting-resolution.json","pointer":"/properties/execution/oneOf/4/properties/age/oneOf/2/properties/signal_refs","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"core/demographic-targeting-resolution.json","pointer":"/properties/execution/oneOf/4/properties/gender/oneOf/1/properties/signal_refs","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"core/dooh-inventory-summary.json","pointer":"/definitions/DoohVenueCount/properties/geo_code","keyword":"maxLength","limit":64,"stability":"new-3.3","tier":"string-code"}, + {"file":"core/dooh-inventory-summary.json","pointer":"/definitions/DoohVenueCount/properties/system","keyword":"maxLength","limit":500,"stability":"new-3.3","tier":"string-generic"}, + {"file":"core/dooh-inventory-summary.json","pointer":"/definitions/DoohVenueCount/properties/venue_type","keyword":"maxLength","limit":500,"stability":"new-3.3","tier":"string-generic"}, + {"file":"core/dooh-inventory-summary.json","pointer":"/properties/venue_counts","keyword":"maxItems","limit":100,"stability":"new-3.3","tier":"array-typical"}, + {"file":"core/evaluator-spec.json","pointer":"/oneOf/0/properties/exemplars/properties/fail","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"core/evaluator-spec.json","pointer":"/oneOf/0/properties/exemplars/properties/pass","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"core/evaluator-spec.json","pointer":"/properties/feature_agent/properties/feature_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/evaluator-spec.json","pointer":"/properties/feature_requirement","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"core/evaluator-spec.json","pointer":"/properties/rank_by","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"core/evaluator-spec.json","pointer":"/properties/rank_by/items/properties/feature_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/execution-requirement-readiness.json","pointer":"/properties/binding_field","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"core/execution-requirement-readiness.json","pointer":"/properties/candidates","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/execution-requirement-readiness.json","pointer":"/properties/candidates/items/properties/name","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/execution-requirement-readiness.json","pointer":"/properties/candidates/items/properties/resource_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/execution-requirement-readiness.json","pointer":"/properties/issues","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/execution-requirement-readiness.json","pointer":"/properties/resolved/properties/name","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/execution-requirement-readiness.json","pointer":"/properties/resolved/properties/resource_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/hold-policy.json","pointer":"/definitions/positive_duration","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"core/installment-publication.json","pointer":"/properties/posts","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/invoice-line.json","pointer":"/properties/media_buy_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/invoice-line.json","pointer":"/properties/package_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/invoice-line.json","pointer":"/properties/reporting_adjustment_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"core/invoice-line.json","pointer":"/properties/reporting_revision_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"core/media-buy-issue.json","pointer":"/properties/creative_id","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"core/media-buy-issue.json","pointer":"/properties/issue_id","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"core/media-buy-issue.json","pointer":"/properties/media_buy_id","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"core/media-buy-issue.json","pointer":"/properties/package_id","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"core/media-buy.json","pointer":"/properties/predecessor_media_buy_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/performance-feedback-assertion.json","pointer":"/properties/creative_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/performance-feedback-assertion.json","pointer":"/properties/media_buy_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/performance-feedback-assertion.json","pointer":"/properties/package_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/performance-feedback-assertion.json","pointer":"/properties/supersedes_feedback_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/placement-definition.json","pointer":"/definitions/PublisherDoohAddress/properties/city","keyword":"maxLength","limit":100,"stability":"new-3.3","tier":"string-id"}, + {"file":"core/placement-definition.json","pointer":"/definitions/PublisherDoohAddress/properties/line1","keyword":"maxLength","limit":200,"stability":"new-3.3","tier":"string-id"}, + {"file":"core/placement-definition.json","pointer":"/definitions/PublisherDoohAddress/properties/postal_code","keyword":"maxLength","limit":64,"stability":"new-3.3","tier":"string-code"}, + {"file":"core/placement-definition.json","pointer":"/definitions/PublisherDoohAddress/properties/region","keyword":"maxLength","limit":64,"stability":"new-3.3","tier":"string-code"}, + {"file":"core/placement-evidence.json","pointer":"/properties/notes","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"core/placement.json","pointer":"/definitions/ProductDoohAddress/properties/city","keyword":"maxLength","limit":100,"stability":"new-3.3","tier":"string-id"}, + {"file":"core/placement.json","pointer":"/definitions/ProductDoohAddress/properties/line1","keyword":"maxLength","limit":200,"stability":"new-3.3","tier":"string-id"}, + {"file":"core/placement.json","pointer":"/definitions/ProductDoohAddress/properties/postal_code","keyword":"maxLength","limit":64,"stability":"new-3.3","tier":"string-code"}, + {"file":"core/placement.json","pointer":"/definitions/ProductDoohAddress/properties/region","keyword":"maxLength","limit":64,"stability":"new-3.3","tier":"string-code"}, + {"file":"core/principal-declarations-state.json","pointer":"/properties/selected_async_adcp_version","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"core/principal-declarations.json","pointer":"/properties/async_adcp_versions/items","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"core/principal-declarations.json","pointer":"/properties/webhook_signing_algorithms","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"core/principal-relationship.json","pointer":"/properties/setup/properties/message","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"core/product-execution-readiness.json","pointer":"/properties/requirements","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/product-filters.json","pointer":"/properties/audience_activation_methods","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-small"}, + {"file":"core/product-filters.json","pointer":"/properties/audience_activation_methods/items/oneOf/2/properties/directions","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"core/product-identity.json","pointer":"/properties/match_keys","keyword":"maxItems","limit":64,"stability":"experimental","tier":"array-small"}, + {"file":"core/product-identity.json","pointer":"/properties/reach_methodology","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"core/product.json","pointer":"/properties/audience_activation/properties/methods","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-small"}, + {"file":"core/product.json","pointer":"/properties/audience_activation/properties/notes","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"core/proposal-offered-webhook.json","pointer":"/properties/account_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/proposal-offered-webhook.json","pointer":"/properties/media_buy_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/reporting-adjustment-receipt.json","pointer":"/properties/rejection_codes","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/reporting-adjustment.json","pointer":"/properties/control_total_deltas","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/reporting-canonicalization-contract.json","pointer":"/properties/golden_vectors/properties/additional","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/reporting-canonicalization-contract.json","pointer":"/properties/golden_vectors/properties/additional/items/properties/canonical_utf8_base64","keyword":"maxLength","limit":1048576,"stability":"experimental","tier":"string-blob"}, + {"file":"core/reporting-canonicalization-contract.json","pointer":"/properties/golden_vectors/properties/additional/items/properties/input_rows","keyword":"maxItems","limit":10000,"stability":"experimental","tier":"array-catalog"}, + {"file":"core/reporting-canonicalization-contract.json","pointer":"/properties/golden_vectors/properties/ordering_encoding/properties/canonical_utf8_base64","keyword":"maxLength","limit":1048576,"stability":"experimental","tier":"string-blob"}, + {"file":"core/reporting-canonicalization-contract.json","pointer":"/properties/golden_vectors/properties/ordering_encoding/properties/input_rows","keyword":"maxItems","limit":10000,"stability":"experimental","tier":"array-catalog"}, + {"file":"core/reporting-canonicalization-contract.json","pointer":"/properties/primary_keys","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-small"}, + {"file":"core/reporting-capabilities.json","pointer":"/properties/available_installment_statuses","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"core/reporting-consumer-status.json","pointer":"/properties/period/properties/source_timezone","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"core/reporting-control-total.json","pointer":"/oneOf/0/properties/value","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/reporting-control-total.json","pointer":"/oneOf/1/properties/value","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/reporting-coverage.json","pointer":"/definitions/ReportingMediaBuyId","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"core/reporting-coverage.json","pointer":"/definitions/ReportingPackageId","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"core/reporting-coverage.json","pointer":"/properties/covered_package_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"core/reporting-coverage.json","pointer":"/properties/fully_covered_media_buy_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"core/reporting-coverage.json","pointer":"/properties/limitations","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/reporting-coverage.json","pointer":"/properties/limitations/items/properties/package_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"core/reporting-coverage.json","pointer":"/properties/media_buy_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"core/reporting-coverage.json","pointer":"/properties/package_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"core/reporting-coverage.json","pointer":"/properties/partially_covered_media_buy_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"core/reporting-coverage.json","pointer":"/properties/unknown_media_buy_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"core/reporting-coverage.json","pointer":"/properties/unknown_package_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"core/reporting-coverage.json","pointer":"/properties/unsupported_media_buy_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"core/reporting-coverage.json","pointer":"/properties/unsupported_package_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"core/reporting-dataset-share-destination.json","pointer":"/oneOf/1/properties/provider/properties/domain","keyword":"maxLength","limit":253,"stability":"experimental","tier":"string-domain"}, + {"file":"core/reporting-delivery-config-state.json","pointer":"/properties/issues","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/reporting-delivery-config.json","pointer":"/properties/scope/properties/media_buy_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"core/reporting-delivery-ready-webhook.json","pointer":"/properties/account_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/reporting-file-manifest.json","pointer":"/properties/control_totals","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/reporting-file-manifest.json","pointer":"/properties/files","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/reporting-file-manifest.json","pointer":"/properties/period/properties/source_timezone","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"core/reporting-ledger-changed-webhook.json","pointer":"/properties/account_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/reporting-obligation.json","pointer":"/properties/account_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/reporting-obligation.json","pointer":"/properties/issues","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/reporting-obligation.json","pointer":"/properties/media_buy_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"core/reporting-obligation.json","pointer":"/properties/period/properties/source_timezone","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"core/reporting-receipt.json","pointer":"/properties/observed_control_totals","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/reporting-receipt.json","pointer":"/properties/rejection_codes","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/reporting-report-definition.json","pointer":"/properties/dimensions","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-small"}, + {"file":"core/reporting-report-definition.json","pointer":"/properties/finality_policies","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/reporting-report-definition.json","pointer":"/properties/finality_policies/items/oneOf/1/properties/duration_after_period_end","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/reporting-report-definition.json","pointer":"/properties/finality_policies/items/oneOf/2/properties/minimum_age","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/reporting-report-definition.json","pointer":"/properties/finality_policies/items/oneOf/2/properties/unchanged_for","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/reporting-report-definition.json","pointer":"/properties/metrics","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-small"}, + {"file":"core/reporting-report-definition.json","pointer":"/properties/restatement_policy/properties/source_requery_duration","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/reporting-report-definition.json","pointer":"/properties/source/properties/provider/properties/domain","keyword":"maxLength","limit":253,"stability":"experimental","tier":"string-domain"}, + {"file":"core/reporting-resource.json","pointer":"/properties/reader_compatibility","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/reporting-revision.json","pointer":"/properties/account_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/reporting-revision.json","pointer":"/properties/control_totals","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/reporting-revision.json","pointer":"/properties/media_buy_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"core/reporting-revision.json","pointer":"/properties/period/properties/source_timezone","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"core/reporting-schedule.json","pointer":"/properties/delivery_sla","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/reporting-schedule.json","pointer":"/properties/period_duration","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"core/reporting-status-changed-webhook.json","pointer":"/properties/account_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/reporting-status-issue.json","pointer":"/properties/media_buy_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"core/reporting-status-issue.json","pointer":"/properties/package_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"core/reporting-subscription-coverage.json","pointer":"/properties/excluded","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/reporting-subscription-coverage.json","pointer":"/properties/gaps","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/reporting-subscription-coverage.json","pointer":"/properties/timezone_cutovers","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/reporting-subscription-state.json","pointer":"/definitions/ReportingSubscriptionAccountExceptions/properties/account_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/reporting-subscription-state.json","pointer":"/definitions/ReportingSubscriptionAccountExceptions/properties/reasons","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"core/reporting-subscription-state.json","pointer":"/definitions/ReportingSubscriptionUnauthorizedAccount/properties/account_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/reporting-subscription.json","pointer":"/properties/exclude_account_ids/items","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/reporting-subscription.json","pointer":"/properties/scope/properties/account_ids/items","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/reporting-verification.json","pointer":"/properties/control_totals","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/reporting-verification.json","pointer":"/properties/physical_checksums","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/reporting-write-destination.json","pointer":"/oneOf/1/properties/provider/properties/domain","keyword":"maxLength","limit":253,"stability":"experimental","tier":"string-domain"}, + {"file":"core/rights-constraint.json","pointer":"/properties/channels","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"core/rights-constraint.json","pointer":"/properties/excluded_channels","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"core/seller-agent-ref.json","pointer":"/properties/id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/age_determination_bases","keyword":"maxItems","limit":32,"stability":"new-3.3","tier":"array-enum"}, + {"file":"core/signal-definition.json","pointer":"/properties/age_determination_bases","keyword":"maxItems","limit":32,"stability":"new-3.3","tier":"array-enum"}, + {"file":"core/signal-listing.json","pointer":"/properties/age_determination_bases","keyword":"maxItems","limit":32,"stability":"new-3.3","tier":"array-enum"}, + {"file":"core/signal-listing.json","pointer":"/properties/pricing_group","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"core/signal-pricing-group-rule.json","pointer":"/properties/pricing_group","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"core/signal-targeting-rules.json","pointer":"/properties/signal_pricing_group_rules","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"core/spot-reporting-capability.json","pointer":"/properties/available_statuses","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"core/vendor-metric-provenance.json","pointer":"/properties/mechanisms","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/10/properties/payload/properties/collection_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"creative/creative-staged-update-changed-webhook.json","pointer":"/properties/account_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"creative/creative-staged-update-changed-webhook.json","pointer":"/properties/creative_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/assignments/properties/assigned_packages/items/properties/trackers","keyword":"maxItems","limit":100,"stability":"new-3.3","tier":"array-typical"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/platform_id","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/assignment_operations/items/oneOf/0/properties/trackers","keyword":"maxItems","limit":100,"stability":"new-3.3","tier":"array-batch"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/assignment_operations/items/oneOf/3/properties/merged_creative_id","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"creative/sync-creatives-response.json","pointer":"/oneOf/0/properties/merges","keyword":"maxItems","limit":100,"stability":"new-3.3","tier":"array-typical"}, + {"file":"creative/sync-creatives-response.json","pointer":"/oneOf/0/properties/merges/items/properties/creative_id","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"creative/sync-creatives-response.json","pointer":"/oneOf/0/properties/merges/items/properties/merged_creative_id","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"creative/sync-creatives-response.json","pointer":"/oneOf/0/properties/merges/items/properties/package_id","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"creative/validate-input-result.json","pointer":"/properties/warnings/items/properties/field","keyword":"maxLength","limit":500,"stability":"new-3.3","tier":"string-generic"}, + {"file":"error-details/budget-too-low.json","pointer":"/properties/budget_field","keyword":"maxLength","limit":500,"stability":"new-3.3","tier":"string-generic"}, + {"file":"error-details/budget-too-low.json","pointer":"/properties/constraint","keyword":"maxLength","limit":500,"stability":"new-3.3","tier":"string-generic"}, + {"file":"error-details/budget-too-low.json","pointer":"/properties/related_field","keyword":"maxLength","limit":500,"stability":"new-3.3","tier":"string-generic"}, + {"file":"error-details/creative-live-update-unsupported.json","pointer":"/properties/live_package_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"error-details/creative-live-update-unsupported.json","pointer":"/properties/live_package_ids/items","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"error-details/creative-live-update-unsupported.json","pointer":"/properties/refused_changes","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"error-details/creative-merge-rejected.json","pointer":"/properties/rejections","keyword":"maxItems","limit":100,"stability":"new-3.3","tier":"array-typical"}, + {"file":"error-details/creative-merge-rejected.json","pointer":"/properties/rejections/items/properties/creative_id","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"error-details/creative-merge-rejected.json","pointer":"/properties/rejections/items/properties/merged_creative_id","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"error-details/creative-merge-rejected.json","pointer":"/properties/rejections/items/properties/package_id","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"error-details/unsupported-targeting-dimension.json","pointer":"/properties/product_id","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"error-details/unsupported-targeting-dimension.json","pointer":"/properties/replacement_dimension","keyword":"maxLength","limit":500,"stability":"new-3.3","tier":"string-generic"}, + {"file":"error-details/unsupported-targeting-dimension.json","pointer":"/properties/supported_dimensions","keyword":"maxItems","limit":32,"stability":"new-3.3","tier":"array-small"}, + {"file":"error-details/unsupported-targeting-dimension.json","pointer":"/properties/supported_dimensions/items","keyword":"maxLength","limit":500,"stability":"new-3.3","tier":"string-generic"}, + {"file":"error-details/unsupported-targeting-dimension.json","pointer":"/properties/unsupported_dimension","keyword":"maxLength","limit":500,"stability":"new-3.3","tier":"string-generic"}, + {"file":"governance/check-governance-request.json","pointer":"/properties/delivery_metrics/properties/audience_distribution/properties/baseline_description","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"governance/check-governance-request.json","pointer":"/properties/plan_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/check-governance-request.json","pointer":"/properties/tool","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"governance/check-governance-response.json","pointer":"/properties/categories_evaluated","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"governance/check-governance-response.json","pointer":"/properties/categories_evaluated/items","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"governance/check-governance-response.json","pointer":"/properties/check_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/check-governance-response.json","pointer":"/properties/conditions","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"governance/check-governance-response.json","pointer":"/properties/conditions/items/properties/field","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"governance/check-governance-response.json","pointer":"/properties/conditions/items/properties/reason","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"governance/check-governance-response.json","pointer":"/properties/delivery_statement/properties/canonical_payload/properties/seller_reference","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/check-governance-response.json","pointer":"/properties/delivery_statement/properties/seller_reference","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/check-governance-response.json","pointer":"/properties/delivery_statement/properties/statement_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/check-governance-response.json","pointer":"/properties/explanation","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"governance/check-governance-response.json","pointer":"/properties/findings","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"governance/check-governance-response.json","pointer":"/properties/findings/items/properties/category_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/check-governance-response.json","pointer":"/properties/findings/items/properties/explanation","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"governance/check-governance-response.json","pointer":"/properties/findings/items/properties/policy_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/check-governance-response.json","pointer":"/properties/findings/items/properties/source_plan_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/check-governance-response.json","pointer":"/properties/findings/items/properties/uncertainty_reason","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"governance/check-governance-response.json","pointer":"/properties/plan_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/check-governance-response.json","pointer":"/properties/policies_evaluated","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"governance/check-governance-response.json","pointer":"/properties/policies_evaluated/items","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"governance/get-plan-audit-logs-request.json","pointer":"/properties/governance_contexts","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"governance/get-plan-audit-logs-request.json","pointer":"/properties/governance_contexts/items","keyword":"maxLength","limit":4096,"stability":"experimental","tier":"string-token"}, + {"file":"governance/get-plan-audit-logs-request.json","pointer":"/properties/plan_ids","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"governance/get-plan-audit-logs-request.json","pointer":"/properties/plan_ids/items","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/get-plan-audit-logs-request.json","pointer":"/properties/portfolio_plan_ids","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"governance/get-plan-audit-logs-request.json","pointer":"/properties/portfolio_plan_ids/items","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/get-plan-audit-logs-request.json","pointer":"/properties/purchase_types","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries","keyword":"maxItems","limit":10000,"stability":"experimental","tier":"array-catalog"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/categories_evaluated","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/categories_evaluated/items","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/delivery/properties/seller_statement_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/delivery_statement/properties/canonical_payload/properties/seller_reference","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/delivery_statement/properties/seller_reference","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/delivery_statement/properties/statement_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/evidence/properties/evidence_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/explanation","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/findings","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/findings/items/properties/category_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/findings/items/properties/explanation","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/findings/items/properties/policy_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/findings/items/properties/source_plan_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/findings/items/properties/uncertainty_reason","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/governance_context","keyword":"maxLength","limit":4096,"stability":"experimental","tier":"string-token"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/outcome_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/outcome_status","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/plan_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/policies_evaluated","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/policies_evaluated/items","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/reason","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/review_reason","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/seller_adjustment_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/seller_reference","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/entries/items/properties/tool","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/governed_actions","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/governed_actions/items/properties/governance_context","keyword":"maxLength","limit":4096,"stability":"experimental","tier":"string-token"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/governed_actions/items/properties/seller_reference","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/plan_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/summary/properties/escalations","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/summary/properties/escalations/items/properties/check_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/summary/properties/escalations/items/properties/reason","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"governance/get-plan-audit-logs-response.json","pointer":"/properties/plans/items/properties/summary/properties/escalations/items/properties/resolution","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"governance/report-plan-adjustment-request.json","pointer":"/properties/adjustment_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/report-plan-adjustment-request.json","pointer":"/properties/outcome_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/report-plan-adjustment-request.json","pointer":"/properties/plan_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/report-plan-adjustment-response.json","pointer":"/properties/adjustment_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/report-plan-outcome-request.json","pointer":"/properties/check_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/report-plan-outcome-request.json","pointer":"/properties/delivery/properties/seller_statement_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/report-plan-outcome-request.json","pointer":"/properties/plan_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/report-plan-outcome-request.json","pointer":"/properties/seller_response/properties/packages","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"governance/report-plan-outcome-response.json","pointer":"/properties/findings","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"governance/report-plan-outcome-response.json","pointer":"/properties/findings/items/properties/category_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/report-plan-outcome-response.json","pointer":"/properties/findings/items/properties/explanation","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"governance/report-plan-outcome-response.json","pointer":"/properties/outcome_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/allOf/0/if/properties/policy_categories","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-small"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/allOf/1/if/properties/policy_ids","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/approved_sellers","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/budget/properties/currency","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/channels/properties/allowed","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/channels/properties/required","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/countries","keyword":"maxItems","limit":256,"stability":"experimental","tier":"array-enum"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/countries/items","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/custom_policies","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/delegations","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/delegations/items/properties/budget_limit/properties/currency","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/delegations/items/properties/markets","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/delegations/items/properties/markets/items","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/plan_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/policy_categories","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-small"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/policy_categories/items","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/policy_ids","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/policy_ids/items","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/portfolio/properties/member_plan_ids","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/portfolio/properties/member_plan_ids/items","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/portfolio/properties/shared_exclusions","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/portfolio/properties/shared_policy_ids","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/portfolio/properties/shared_policy_ids/items","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/portfolio/properties/total_budget_cap/properties/currency","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/regions","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-enum"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/regions/items","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/restricted_attributes","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/restricted_attributes_custom","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"governance/sync-plans-request.json","pointer":"/properties/plans/items/properties/restricted_attributes_custom/items","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"governance/sync-plans-response.json","pointer":"/properties/plans","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"governance/sync-plans-response.json","pointer":"/properties/plans/items/properties/categories","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-small"}, + {"file":"governance/sync-plans-response.json","pointer":"/properties/plans/items/properties/categories/items/properties/category_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/sync-plans-response.json","pointer":"/properties/plans/items/properties/plan_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/sync-plans-response.json","pointer":"/properties/plans/items/properties/resolved_policies","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"governance/sync-plans-response.json","pointer":"/properties/plans/items/properties/resolved_policies/items/properties/policy_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"governance/sync-plans-response.json","pointer":"/properties/plans/items/properties/resolved_policies/items/properties/reason","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"media-buy/build-creative-request.json","pointer":"/properties/signal_conditions","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"media-buy/build-creative-request.json","pointer":"/properties/signal_conditions/items/allOf/1/properties/signal_agent_segment_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/2/properties/creatives/items/properties/variants/items/properties/eval/properties/features","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-small"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_spot/items/allOf/1/properties/break_position/properties/break_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_spot/items/allOf/1/properties/replaces_spot_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"media-buy/get-media-buy-issue-request.json","pointer":"/properties/issue_id","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"media-buy/get-media-buy-issue-request.json","pointer":"/properties/media_buy_id","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"media-buy/get-media-buy-issue-response.json","pointer":"/oneOf/1/properties/errors","keyword":"maxItems","limit":100,"stability":"new-3.3","tier":"array-typical"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/packages/items/properties/creative_approvals/items/properties/trackers","keyword":"maxItems","limit":100,"stability":"new-3.3","tier":"array-typical"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/predecessor_media_buy_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"media-buy/get-reporting-status-request.json","pointer":"/properties/feed_purposes","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"media-buy/get-reporting-status-request.json","pointer":"/properties/finality","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"media-buy/get-reporting-status-request.json","pointer":"/properties/health","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"media-buy/get-reporting-status-response.json","pointer":"/oneOf/1/oneOf/1/properties/errors","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"media-buy/get-reporting-status-response.json","pointer":"/properties/account_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"media-buy/get-reporting-status-response.json","pointer":"/properties/adjustment_receipts","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-batch"}, + {"file":"media-buy/get-reporting-status-response.json","pointer":"/properties/adjustments","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-batch"}, + {"file":"media-buy/get-reporting-status-response.json","pointer":"/properties/consumer_statuses","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-batch"}, + {"file":"media-buy/get-reporting-status-response.json","pointer":"/properties/errors","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"media-buy/get-reporting-status-response.json","pointer":"/properties/issues","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"media-buy/get-reporting-status-response.json","pointer":"/properties/materializations","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-batch"}, + {"file":"media-buy/get-reporting-status-response.json","pointer":"/properties/periods","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-batch"}, + {"file":"media-buy/get-reporting-status-response.json","pointer":"/properties/receipts","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-batch"}, + {"file":"media-buy/get-reporting-status-response.json","pointer":"/properties/revisions","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-batch"}, + {"file":"media-buy/get-reporting-status-response.json","pointer":"/properties/scope/properties/delivery_config_generations","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-batch"}, + {"file":"media-buy/get-reporting-status-response.json","pointer":"/properties/scope/properties/feed_purposes","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"media-buy/get-reporting-status-response.json","pointer":"/properties/scope/properties/finality","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"media-buy/get-reporting-status-response.json","pointer":"/properties/scope/properties/media_buy_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"media-buy/get-reporting-status-response.json","pointer":"/properties/subscription_coverage","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-batch"}, + {"file":"media-buy/list-collections-request.json","pointer":"/properties/filters/properties/genres_exclude","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"media-buy/list-collections-request.json","pointer":"/properties/filters/properties/genres_exclude/items","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"media-buy/list-collections-request.json","pointer":"/properties/filters/properties/genres_include","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"media-buy/list-collections-request.json","pointer":"/properties/filters/properties/genres_include/items","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"media-buy/list-collections-request.json","pointer":"/properties/filters/properties/kinds","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"media-buy/list-collections-request.json","pointer":"/properties/filters/properties/languages","keyword":"maxItems","limit":256,"stability":"experimental","tier":"array-enum"}, + {"file":"media-buy/list-collections-request.json","pointer":"/properties/filters/properties/name_contains","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"media-buy/list-collections-request.json","pointer":"/properties/filters/properties/platforms","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-small"}, + {"file":"media-buy/list-collections-request.json","pointer":"/properties/filters/properties/platforms/items","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"media-buy/list-collections-request.json","pointer":"/properties/filters/properties/statuses","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"media-buy/list-collections-request.json","pointer":"/properties/filters/properties/talent","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-batch"}, + {"file":"media-buy/list-collections-request.json","pointer":"/properties/filters/properties/talent/items/properties/domain","keyword":"maxLength","limit":253,"stability":"experimental","tier":"string-domain"}, + {"file":"media-buy/list-collections-request.json","pointer":"/properties/if_collections_version","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"media-buy/list-collections-response.json","pointer":"/properties/collections_version","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"media-buy/list-proposals-request.json","pointer":"/properties/context_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"media-buy/list-proposals-request.json","pointer":"/properties/cursor","keyword":"maxLength","limit":4096,"stability":"experimental","tier":"string-token"}, + {"file":"media-buy/list-proposals-request.json","pointer":"/properties/dispositions","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"media-buy/list-proposals-request.json","pointer":"/properties/media_buy_ids/items","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"media-buy/list-proposals-response.json","pointer":"/properties/next_cursor","keyword":"maxLength","limit":4096,"stability":"experimental","tier":"string-token"}, + {"file":"media-buy/list-proposals-response.json","pointer":"/properties/opportunities","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"media-buy/list-proposals-response.json","pointer":"/properties/proposals","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"media-buy/provide-performance-feedback-response.json","pointer":"/oneOf/0/properties/feedback_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"media-buy/report-media-buy-issue-request.json","pointer":"/properties/creative_id","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"media-buy/report-media-buy-issue-request.json","pointer":"/properties/media_buy_id","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"media-buy/report-media-buy-issue-request.json","pointer":"/properties/package_id","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"media-buy/report-media-buy-issue-response.json","pointer":"/oneOf/1/properties/errors","keyword":"maxItems","limit":100,"stability":"new-3.3","tier":"array-typical"}, + {"file":"media-buy/sync-audiences-response.json","pointer":"/oneOf/0/properties/audiences/items/properties/platform_id","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"media-buy/sync-audiences-response.json","pointer":"/oneOf/0/properties/audiences/items/properties/source/properties/columns_read","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"media-buy/sync-audiences-response.json","pointer":"/oneOf/0/properties/audiences/items/properties/source/properties/columns_read/items","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"media-buy/sync-audiences-response.json","pointer":"/oneOf/0/properties/audiences/items/properties/source/properties/locator","keyword":"maxLength","limit":2048,"stability":"experimental","tier":"string-url"}, + {"file":"media-buy/sync-audiences-response.json","pointer":"/oneOf/0/properties/audiences/items/properties/source/properties/segment_ref","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"media-buy/sync-event-sources-response.json","pointer":"/oneOf/0/properties/event_sources/items/properties/platform_id","keyword":"maxLength","limit":255,"stability":"new-3.3","tier":"string-id"}, + {"file":"signals/get-signals-response.json","pointer":"/properties/signal_pricing_group_rules","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-batch"}, + {"file":"signals/get-signals-response.json","pointer":"/properties/signals/items/properties/source_audience_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-get-offering-request.json","pointer":"/properties/intent","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-get-offering-request.json","pointer":"/properties/offering_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-get-offering-response.json","pointer":"/properties/alternative_offering_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"sponsored-intelligence/si-get-offering-response.json","pointer":"/properties/alternative_offering_ids/items","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-get-offering-response.json","pointer":"/properties/errors","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"sponsored-intelligence/si-get-offering-response.json","pointer":"/properties/matching_products","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"sponsored-intelligence/si-get-offering-response.json","pointer":"/properties/matching_products/items/properties/availability_summary","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"sponsored-intelligence/si-get-offering-response.json","pointer":"/properties/matching_products/items/properties/name","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-get-offering-response.json","pointer":"/properties/matching_products/items/properties/original_price","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"sponsored-intelligence/si-get-offering-response.json","pointer":"/properties/matching_products/items/properties/price","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"sponsored-intelligence/si-get-offering-response.json","pointer":"/properties/matching_products/items/properties/product_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-get-offering-response.json","pointer":"/properties/offering/properties/offering_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-get-offering-response.json","pointer":"/properties/offering/properties/price_hint","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"sponsored-intelligence/si-get-offering-response.json","pointer":"/properties/offering/properties/summary","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"sponsored-intelligence/si-get-offering-response.json","pointer":"/properties/offering/properties/tagline","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-get-offering-response.json","pointer":"/properties/offering/properties/title","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"sponsored-intelligence/si-get-offering-response.json","pointer":"/properties/offering_token","keyword":"maxLength","limit":4096,"stability":"experimental","tier":"string-token"}, + {"file":"sponsored-intelligence/si-get-offering-response.json","pointer":"/properties/unavailable_reason","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"sponsored-intelligence/si-identity.json","pointer":"/properties/anonymous_session_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-identity.json","pointer":"/properties/consent_scope","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"sponsored-intelligence/si-identity.json","pointer":"/properties/privacy_policy_acknowledged/properties/brand_policy_version","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"sponsored-intelligence/si-identity.json","pointer":"/properties/user/properties/locale","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"sponsored-intelligence/si-identity.json","pointer":"/properties/user/properties/name","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-identity.json","pointer":"/properties/user/properties/phone","keyword":"maxLength","limit":30,"stability":"experimental","tier":"string-code"}, + {"file":"sponsored-intelligence/si-identity.json","pointer":"/properties/user/properties/shipping_address/properties/city","keyword":"maxLength","limit":100,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-identity.json","pointer":"/properties/user/properties/shipping_address/properties/country","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"sponsored-intelligence/si-identity.json","pointer":"/properties/user/properties/shipping_address/properties/postal_code","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"sponsored-intelligence/si-identity.json","pointer":"/properties/user/properties/shipping_address/properties/state","keyword":"maxLength","limit":100,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-identity.json","pointer":"/properties/user/properties/shipping_address/properties/street","keyword":"maxLength","limit":200,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-initiate-session-request.json","pointer":"/properties/intent","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-initiate-session-request.json","pointer":"/properties/media_buy_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-initiate-session-request.json","pointer":"/properties/offering_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-initiate-session-request.json","pointer":"/properties/offering_token","keyword":"maxLength","limit":4096,"stability":"experimental","tier":"string-token"}, + {"file":"sponsored-intelligence/si-initiate-session-request.json","pointer":"/properties/placement","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"sponsored-intelligence/si-initiate-session-response.json","pointer":"/properties/errors","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"sponsored-intelligence/si-initiate-session-response.json","pointer":"/properties/response/properties/message","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"sponsored-intelligence/si-initiate-session-response.json","pointer":"/properties/response/properties/ui_elements","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"sponsored-intelligence/si-initiate-session-response.json","pointer":"/properties/session_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-send-message-request.json","pointer":"/properties/action_response/properties/action","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-send-message-request.json","pointer":"/properties/message","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"sponsored-intelligence/si-send-message-request.json","pointer":"/properties/session_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-send-message-response.json","pointer":"/properties/errors","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"sponsored-intelligence/si-send-message-response.json","pointer":"/properties/handoff/properties/context_for_checkout/properties/applied_offers","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"sponsored-intelligence/si-send-message-response.json","pointer":"/properties/handoff/properties/context_for_checkout/properties/applied_offers/items","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"sponsored-intelligence/si-send-message-response.json","pointer":"/properties/handoff/properties/context_for_checkout/properties/conversation_summary","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"sponsored-intelligence/si-send-message-response.json","pointer":"/properties/handoff/properties/intent/properties/action","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-send-message-response.json","pointer":"/properties/handoff/properties/intent/properties/price/properties/currency","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"sponsored-intelligence/si-send-message-response.json","pointer":"/properties/mcp_resource_uri","keyword":"maxLength","limit":2048,"stability":"experimental","tier":"string-url"}, + {"file":"sponsored-intelligence/si-send-message-response.json","pointer":"/properties/response/properties/message","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"sponsored-intelligence/si-send-message-response.json","pointer":"/properties/response/properties/ui_elements","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"sponsored-intelligence/si-send-message-response.json","pointer":"/properties/session_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-sponsored-context-receipt.json","pointer":"/properties/host_receipt/properties/disclosure_commitment/properties/label_text","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"sponsored-intelligence/si-sponsored-context-receipt.json","pointer":"/properties/host_receipt/properties/disclosure_commitment/properties/notes","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"sponsored-intelligence/si-sponsored-context-receipt.json","pointer":"/properties/host_receipt/properties/host_surface","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"sponsored-intelligence/si-sponsored-context-receipt.json","pointer":"/properties/host_receipt/properties/rejection_reason","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"sponsored-intelligence/si-sponsored-context.json","pointer":"/properties/disclosure_obligation/properties/jurisdictions","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"sponsored-intelligence/si-sponsored-context.json","pointer":"/properties/disclosure_obligation/properties/jurisdictions/items/properties/country","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"sponsored-intelligence/si-sponsored-context.json","pointer":"/properties/disclosure_obligation/properties/jurisdictions/items/properties/region","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"sponsored-intelligence/si-sponsored-context.json","pointer":"/properties/disclosure_obligation/properties/jurisdictions/items/properties/regulation","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"sponsored-intelligence/si-sponsored-context.json","pointer":"/properties/disclosure_obligation/properties/label_text","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"sponsored-intelligence/si-sponsored-context.json","pointer":"/properties/paying_principal/properties/account/properties/account_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-sponsored-context.json","pointer":"/properties/paying_principal/properties/display_name","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-sponsored-context.json","pointer":"/properties/paying_principal/properties/operator","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-terminate-session-request.json","pointer":"/properties/session_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-terminate-session-request.json","pointer":"/properties/termination_context/properties/cause","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"sponsored-intelligence/si-terminate-session-request.json","pointer":"/properties/termination_context/properties/summary","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"sponsored-intelligence/si-terminate-session-response.json","pointer":"/properties/acp_handoff/properties/checkout_token","keyword":"maxLength","limit":4096,"stability":"experimental","tier":"string-token"}, + {"file":"sponsored-intelligence/si-terminate-session-response.json","pointer":"/properties/errors","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"sponsored-intelligence/si-terminate-session-response.json","pointer":"/properties/session_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-ui-element.json","pointer":"/allOf/0/then/properties/data/properties/message","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"sponsored-intelligence/si-ui-element.json","pointer":"/allOf/1/then/properties/data/properties/label","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-ui-element.json","pointer":"/allOf/2/then/properties/data/properties/alt","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"sponsored-intelligence/si-ui-element.json","pointer":"/allOf/2/then/properties/data/properties/caption","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"sponsored-intelligence/si-ui-element.json","pointer":"/allOf/3/then/properties/data/properties/badge","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-ui-element.json","pointer":"/allOf/3/then/properties/data/properties/cta/properties/action","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-ui-element.json","pointer":"/allOf/3/then/properties/data/properties/cta/properties/label","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-ui-element.json","pointer":"/allOf/3/then/properties/data/properties/description","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"sponsored-intelligence/si-ui-element.json","pointer":"/allOf/3/then/properties/data/properties/price","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"sponsored-intelligence/si-ui-element.json","pointer":"/allOf/3/then/properties/data/properties/subtitle","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-ui-element.json","pointer":"/allOf/3/then/properties/data/properties/title","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"sponsored-intelligence/si-ui-element.json","pointer":"/allOf/4/then/properties/data/properties/items","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"sponsored-intelligence/si-ui-element.json","pointer":"/allOf/4/then/properties/data/properties/title","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"sponsored-intelligence/si-ui-element.json","pointer":"/allOf/5/then/properties/data/properties/action","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-ui-element.json","pointer":"/allOf/5/then/properties/data/properties/label","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-ui-element.json","pointer":"/allOf/6/then/properties/apps/additionalProperties/properties/app_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"sponsored-intelligence/si-ui-element.json","pointer":"/allOf/6/then/properties/apps/additionalProperties/properties/deep_link","keyword":"maxLength","limit":2048,"stability":"experimental","tier":"string-url"}, + {"file":"sponsored-intelligence/si-ui-element.json","pointer":"/allOf/7/then/properties/data/properties/actions","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"sponsored-intelligence/si-ui-element.json","pointer":"/allOf/7/then/properties/data/properties/actions/items/properties/label","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trust/v1/trust-acknowledgements.json","pointer":"/properties/$schema","keyword":"maxLength","limit":2048,"stability":"experimental","tier":"string-url"}, + {"file":"trust/v1/trust-acknowledgements.json","pointer":"/properties/acknowledgements","keyword":"maxItems","limit":10000,"stability":"experimental","tier":"array-catalog"}, + {"file":"trust/v1/trust.json","pointer":"/definitions/agent/properties/countries","keyword":"maxItems","limit":256,"stability":"experimental","tier":"array-enum"}, + {"file":"trust/v1/trust.json","pointer":"/definitions/agent/properties/description","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"trust/v1/trust.json","pointer":"/definitions/agent/properties/id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trust/v1/trust.json","pointer":"/definitions/agent/properties/profiles/allOf/1/properties/adcp/properties/available_uses","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"trust/v1/trust.json","pointer":"/definitions/agent/properties/profiles/allOf/1/properties/adcp/properties/right_types","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"trust/v1/trust.json","pointer":"/definitions/agent/properties/protocols","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"}, + {"file":"trust/v1/trust.json","pointer":"/definitions/agent/properties/roles","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"trust/v1/trust.json","pointer":"/definitions/domain","keyword":"maxLength","limit":253,"stability":"experimental","tier":"string-domain"}, + {"file":"trust/v1/trust.json","pointer":"/definitions/grant/properties/agents","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"trust/v1/trust.json","pointer":"/definitions/grant/properties/countries","keyword":"maxItems","limit":256,"stability":"experimental","tier":"array-enum"}, + {"file":"trust/v1/trust.json","pointer":"/definitions/grant/properties/profiles/allOf/1/properties/adcp/properties/brands","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"trust/v1/trust.json","pointer":"/definitions/grant/properties/profiles/allOf/1/properties/adcp/properties/brands/items","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trust/v1/trust.json","pointer":"/definitions/grant/properties/scopes","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-small"}, + {"file":"trust/v1/trust.json","pointer":"/definitions/namespaced_token","keyword":"maxLength","limit":4096,"stability":"experimental","tier":"string-token"}, + {"file":"trust/v1/trust.json","pointer":"/definitions/record_profiles/allOf/1/properties/adcp/properties/identity_relying_parties","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"trust/v1/trust.json","pointer":"/oneOf/0/properties/$schema","keyword":"maxLength","limit":2048,"stability":"experimental","tier":"string-url"}, + {"file":"trust/v1/trust.json","pointer":"/oneOf/1/properties/$schema","keyword":"maxLength","limit":2048,"stability":"experimental","tier":"string-url"}, + {"file":"trust/v1/trust.json","pointer":"/oneOf/1/properties/acknowledgements","keyword":"maxItems","limit":500,"stability":"experimental","tier":"array-large"}, + {"file":"trust/v1/trust.json","pointer":"/oneOf/1/properties/agents","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"trust/v1/trust.json","pointer":"/oneOf/1/properties/grants","keyword":"maxItems","limit":500,"stability":"experimental","tier":"array-large"}, + {"file":"trust/v1/trust.json","pointer":"/oneOf/1/properties/version","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"trusted-match/available-package.json","pointer":"/properties/catalogs","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"trusted-match/available-package.json","pointer":"/properties/format_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"trusted-match/available-package.json","pointer":"/properties/format_options","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"trusted-match/available-package.json","pointer":"/properties/media_buy_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/available-package.json","pointer":"/properties/package_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/context-match-request.json","pointer":"/properties/adcp_version","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"trusted-match/context-match-request.json","pointer":"/properties/artifact_refs/items/properties/value","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/context-match-request.json","pointer":"/properties/context_signals/properties/content_policies/items","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"trusted-match/context-match-request.json","pointer":"/properties/context_signals/properties/embedding","keyword":"maxLength","limit":65536,"stability":"experimental","tier":"string-blob"}, + {"file":"trusted-match/context-match-request.json","pointer":"/properties/context_signals/properties/embedding_model","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"trusted-match/context-match-request.json","pointer":"/properties/context_signals/properties/taxonomy_source","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/context-match-request.json","pointer":"/properties/context_signals/properties/topics/items","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"trusted-match/context-match-request.json","pointer":"/properties/geo/properties/metro/properties/value","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/context-match-request.json","pointer":"/properties/package_ids/items","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/context-match-request.json","pointer":"/properties/placement_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/context-match-request.json","pointer":"/properties/protocol_version","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"trusted-match/context-match-request.json","pointer":"/properties/request_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/context-match-response.json","pointer":"/definitions/targeting_kvs","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"trusted-match/context-match-response.json","pointer":"/definitions/targeting_kvs/items/properties/key","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/context-match-response.json","pointer":"/definitions/targeting_kvs/items/properties/value","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/context-match-response.json","pointer":"/properties/offers","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"trusted-match/context-match-response.json","pointer":"/properties/request_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/context-match-response.json","pointer":"/properties/signals/properties/segments","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"trusted-match/context-match-response.json","pointer":"/properties/signals/properties/segments/items","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/error.json","pointer":"/properties/message","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"trusted-match/error.json","pointer":"/properties/request_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/identity-match-request.json","pointer":"/properties/adcp_version","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"trusted-match/identity-match-request.json","pointer":"/properties/consent/properties/gpp","keyword":"maxLength","limit":4096,"stability":"experimental","tier":"string-token"}, + {"file":"trusted-match/identity-match-request.json","pointer":"/properties/consent/properties/tcf_consent","keyword":"maxLength","limit":4096,"stability":"experimental","tier":"string-token"}, + {"file":"trusted-match/identity-match-request.json","pointer":"/properties/consent/properties/us_privacy","keyword":"maxLength","limit":16,"stability":"experimental","tier":"string-code"}, + {"file":"trusted-match/identity-match-request.json","pointer":"/properties/identities/items/properties/attestation/properties/action","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/identity-match-request.json","pointer":"/properties/identities/items/properties/attestation/properties/relying_party_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/identity-match-request.json","pointer":"/properties/identities/items/properties/attestation/properties/scheme","keyword":"maxLength","limit":500,"stability":"experimental","tier":"string-generic"}, + {"file":"trusted-match/identity-match-request.json","pointer":"/properties/identities/items/properties/attestation/properties/signal_binding","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/identity-match-request.json","pointer":"/properties/identities/items/properties/user_token","keyword":"maxLength","limit":4096,"stability":"experimental","tier":"string-token"}, + {"file":"trusted-match/identity-match-request.json","pointer":"/properties/package_ids","keyword":"maxItems","limit":500,"stability":"experimental","tier":"array-batch"}, + {"file":"trusted-match/identity-match-request.json","pointer":"/properties/package_ids/items","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/identity-match-request.json","pointer":"/properties/protocol_version","keyword":"maxLength","limit":64,"stability":"experimental","tier":"string-code"}, + {"file":"trusted-match/identity-match-request.json","pointer":"/properties/request_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/identity-match-response.json","pointer":"/properties/eligible_package_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"trusted-match/identity-match-response.json","pointer":"/properties/eligible_package_ids/items","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/identity-match-response.json","pointer":"/properties/request_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/identity-match-response.json","pointer":"/properties/tmpx","keyword":"maxLength","limit":4096,"stability":"experimental","tier":"string-token"}, + {"file":"trusted-match/offer.json","pointer":"/properties/creative_data/additionalProperties","keyword":"maxLength","limit":1048576,"stability":"experimental","tier":"string-blob"}, + {"file":"trusted-match/offer.json","pointer":"/properties/package_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/offer.json","pointer":"/properties/summary","keyword":"maxLength","limit":2000,"stability":"experimental","tier":"string-text"}, + {"file":"trusted-match/provider-context-match-response.json","pointer":"/definitions/targeting_kvs","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"trusted-match/provider-context-match-response.json","pointer":"/definitions/targeting_kvs/items/properties/key","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/provider-context-match-response.json","pointer":"/definitions/targeting_kvs/items/properties/value","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/provider-context-match-response.json","pointer":"/properties/offers","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"trusted-match/provider-context-match-response.json","pointer":"/properties/request_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/provider-context-match-response.json","pointer":"/properties/signals/properties/segments","keyword":"maxItems","limit":100,"stability":"experimental","tier":"array-typical"}, + {"file":"trusted-match/provider-context-match-response.json","pointer":"/properties/signals/properties/segments/items","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/provider-identity-match-response.json","pointer":"/properties/eligible_package_ids","keyword":"maxItems","limit":1000,"stability":"experimental","tier":"array-large"}, + {"file":"trusted-match/provider-identity-match-response.json","pointer":"/properties/eligible_package_ids/items","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/provider-identity-match-response.json","pointer":"/properties/request_id","keyword":"maxLength","limit":255,"stability":"experimental","tier":"string-id"}, + {"file":"trusted-match/provider-registration.json","pointer":"/properties/countries","keyword":"maxItems","limit":256,"stability":"experimental","tier":"array-enum"}, + {"file":"trusted-match/provider-registration.json","pointer":"/properties/match_keys","keyword":"maxItems","limit":64,"stability":"experimental","tier":"array-small"}, + {"file":"trusted-match/provider-registration.json","pointer":"/properties/uid_types","keyword":"maxItems","limit":32,"stability":"experimental","tier":"array-enum"} + ] +} diff --git a/scripts/schema-bounds-inventory.json b/scripts/schema-bounds-inventory.json new file mode 100644 index 00000000000..e33e228beb6 --- /dev/null +++ b/scripts/schema-bounds-inventory.json @@ -0,0 +1,3826 @@ +{ + "meta": { + "schema_version": "3.3.0-beta.5", + "last_stable_release": "3.2.8", + "source_files": 1116, + "already_bounded_arrays": 468, + "skipped_strings": { + "const": 608, + "enum": 986, + "format:uri": 308, + "format:date-time": 525, + "bounded-pattern": 526, + "format:date": 32, + "bounded": 855, + "format:email": 11, + "format:uuid": 18 + }, + "unbounded_uri_strings": 304, + "unresolved_refs": [], + "stale_exclusions": [], + "ordering": "file, then pointer" + }, + "tiers": { + "array-enum": "Set of enum values, or of codes from a standard code set: bounded by the set, with a floor of 32 (256 for ISO 3166-1 and ISO 639 codes, 1,000 for ISO 3166-2 regions).", + "array-small": "Small closed sets and tuples (tags, sizes, flags, ranges): 32.", + "array-typical": "Typical lists nested inside an object: 100.", + "array-batch": "Request batches and result pages: 100 per request, 1,000 in the response that echoes them.", + "array-large": "Id, identifier and domain lists that scale with an account or portfolio: 1,000.", + "array-catalog": "Catalog-scale payloads (items, records, events, audience members): 10,000.", + "string-code": "Short codes and tokens: 64.", + "string-id": "Identifiers, names and labels: 255 (the repository default; 262 fields already use it).", + "string-domain": "DNS names: 253 (RFC 1035).", + "string-text": "Short free text (reasons, messages, descriptions): 2,000 (the repository default for prose).", + "string-note": "One-line notes and summaries: 500.", + "string-url": "URLs and locators: 2,048.", + "string-token": "Opaque tokens, cursors and signatures: 4,096.", + "string-body": "Long bodies (markup, scripts, transcripts, briefs): 100,000.", + "string-blob": "Encoded binary or inline documents: 1,048,576, the existing markup ceiling.", + "string-generic": "No name signal: 500, to be confirmed by the owning working group." + }, + "summary": { + "array": { + "total": 1481, + "files": 394, + "by_stability": { + "experimental": 30, + "new-3.3": 9, + "stable": 1442 + }, + "by_side": { + "both": 466, + "other": 232, + "request": 235, + "response": 548 + }, + "by_stability_and_side": { + "experimental/both": 7, + "experimental/other": 1, + "experimental/response": 22, + "new-3.3/both": 5, + "new-3.3/request": 1, + "new-3.3/response": 3, + "stable/both": 454, + "stable/other": 231, + "stable/request": 234, + "stable/response": 523 + }, + "by_tier": { + "array-batch": 166, + "array-catalog": 4, + "array-enum": 408, + "array-large": 61, + "array-small": 131, + "array-typical": 656, + "inline-property-list": 55 + }, + "by_action": { + "deferred (#8198)": 25, + "deferred (SDK generation)": 4, + "move out of band (4.0)": 55, + "tighten in 4.0": 1394, + "withdrawn (#8501)": 3 + } + }, + "string": { + "total": 1841, + "files": 466, + "by_stability": { + "experimental": 2, + "new-3.3": 3, + "stable": 1836 + }, + "by_side": { + "both": 579, + "other": 414, + "request": 291, + "response": 557 + }, + "by_stability_and_side": { + "experimental/both": 1, + "experimental/response": 1, + "new-3.3/both": 2, + "new-3.3/response": 1, + "stable/both": 576, + "stable/other": 414, + "stable/request": 291, + "stable/response": 555 + }, + "by_tier": { + "string-body": 15, + "string-code": 207, + "string-domain": 65, + "string-generic": 431, + "string-id": 869, + "string-text": 200, + "string-token": 43, + "string-url": 11 + }, + "by_action": { + "deferred (SDK generation)": 1, + "tighten in 4.0": 1836, + "withdrawn (#8501)": 4 + } + }, + "inline_property_lists": { + "total": 56, + "by_kind": { + "collection": 22, + "property": 34 + }, + "by_stability": { + "experimental": 8, + "stable": 48 + }, + "unbounded": 55 + } + }, + "unbounded_uri_strings": [ + "a2ui/si-catalog.json#/definitions/AppHandoff/properties/apps/additionalProperties/properties/url", + "aao/agent-publishers.json#/properties/agent_url", + "account/sync-accounts-response.json#/oneOf/0/properties/accounts/items/properties/setup/properties/url", + "account/sync-governance-request.json#/properties/accounts/items/properties/governance_agents/items/properties/url", + "account/sync-governance-response.json#/oneOf/0/properties/accounts/items/properties/governance_agents/items/properties/url", + "adagents.json#/oneOf/0/properties/authoritative_location", + "adagents.json#/oneOf/1/properties/contact/properties/privacy_policy_url", + "adagents.json#/oneOf/1/properties/property_features/items/properties/url", + "adagents.json#/oneOf/1/properties/superseded_by", + "brand.json#/definitions/asset/properties/url", + "brand.json#/definitions/asset_library/properties/url", + "brand.json#/definitions/brand/properties/collections/items/properties/seller_agent_url", + "brand.json#/definitions/brand/properties/privacy_policy_url", + "brand.json#/definitions/brand/properties/url", + "brand.json#/definitions/brand_agent/properties/url", + "brand.json#/definitions/brand_agent_entry/properties/jwks_uri", + "brand.json#/definitions/brand_agent_entry/properties/url", + "brand.json#/definitions/data_subject_contestation/properties/url", + "brand.json#/definitions/font_file/properties/url", + "brand.json#/definitions/logo/properties/url", + "brand.json#/definitions/logo_usage_rule/properties/logo_url", + "brand.json#/definitions/product_catalog/properties/agentic_checkout/properties/endpoint", + "brand.json#/definitions/product_catalog/properties/feed_url", + "brand.json#/definitions/rights_agent/properties/url", + "brand.json#/oneOf/0/properties/authoritative_location", + "brand/acquire-rights-response.json#/oneOf/0/properties/usage_reporting_url", + "brand/creative-approval-request.json#/properties/creative_url", + "brand/creative-approval-response.json#/oneOf/0/properties/creative_url", + "brand/creative-approval-response.json#/oneOf/1/properties/creative_url", + "brand/creative-approval-response.json#/oneOf/2/properties/creative_url", + "brand/creative-approval-response.json#/oneOf/2/properties/status_url", + "brand/get-brand-identity-response.json#/oneOf/0/properties/assets/items/properties/url", + "brand/get-brand-identity-response.json#/oneOf/0/properties/collections/items/properties/seller_agent_url", + "brand/get-brand-identity-response.json#/oneOf/0/properties/fonts/definitions/font_role/oneOf/1/properties/files/items/properties/url", + "brand/get-brand-identity-response.json#/oneOf/0/properties/logos/items/properties/url", + "brand/get-rights-response.json#/oneOf/0/properties/rights/items/properties/preview_assets/items/properties/url", + "brand/search-brands-response.json#/definitions/SearchBrandResult/properties/logos/items/properties/url", + "collection/collection-list.json#/properties/webhook_url", + "collection/update-collection-list-request.json#/properties/webhook_url", + "compliance/comply-test-controller-response.json#/oneOf/6/properties/recorded_calls/items/properties/url", + "content-standards/artifact.json#/properties/assets/items/oneOf/1/properties/url", + "content-standards/artifact.json#/properties/assets/items/oneOf/2/properties/thumbnail_url", + "content-standards/artifact.json#/properties/assets/items/oneOf/2/properties/url", + "content-standards/artifact.json#/properties/assets/items/oneOf/3/properties/url", + "content-standards/artifact.json#/properties/identifiers/properties/rss_url", + "content-standards/artifact.json#/properties/metadata/properties/canonical", + "content-standards/artifact.json#/properties/url", + "content-standards/create-content-standards-request.json#/properties/calibration_exemplars/properties/fail/items/oneOf/0/properties/value", + "content-standards/create-content-standards-request.json#/properties/calibration_exemplars/properties/pass/items/oneOf/0/properties/value", + "content-standards/update-content-standards-request.json#/properties/calibration_exemplars/properties/fail/items/oneOf/0/properties/value", + "content-standards/update-content-standards-request.json#/properties/calibration_exemplars/properties/pass/items/oneOf/0/properties/value", + "core/account-request-changed-webhook.json#/properties/agent_url", + "core/account.json#/properties/governance_agents/items/properties/url", + "core/account.json#/properties/reporting_bucket/properties/setup_instructions", + "core/account.json#/properties/setup/properties/url", + "core/agent-notification-config-state.json#/properties/url", + "core/agent-notification-config.json#/properties/url", + "core/agent-onboarding-tier.json#/properties/url", + "core/agent-onboarding.json#/properties/url", + "core/agent-reporting-destination-state.json#/properties/setup/properties/setup_url", + "core/agent-webhook-challenge.json#/properties/seller_agent_url", + "core/app-item.json#/properties/deep_link_url", + "core/app-item.json#/properties/icon_url", + "core/app-item.json#/properties/preview_video_url", + "core/app-item.json#/properties/screenshots/items", + "core/app-item.json#/properties/store_url", + "core/assets/audio-asset.json#/properties/transcript_url", + "core/assets/audio-asset.json#/properties/url", + "core/assets/daast-asset.json#/properties/transcript_url", + "core/assets/image-asset.json#/properties/url", + "core/assets/published-post-asset.json#/properties/identity_ref/properties/profile_url", + "core/assets/published-post-asset.json#/properties/post_url", + "core/assets/published-post-asset.json#/properties/reference_authorization/properties/authorization_url", + "core/assets/vast-asset.json#/properties/audio_description_url", + "core/assets/vast-asset.json#/properties/captions_url", + "core/assets/video-asset.json#/properties/audio_description_url", + "core/assets/video-asset.json#/properties/captions_url", + "core/assets/video-asset.json#/properties/transcript_url", + "core/assets/video-asset.json#/properties/url", + "core/assets/webhook-asset.json#/properties/url", + "core/assets/zip-asset.json#/properties/backup_image_url", + "core/assets/zip-asset.json#/properties/url", + "core/attestation-capabilities.json#/properties/accepted_claim_types/items", + "core/attestation-capabilities.json#/properties/accepted_issuers/items/properties/claim_types/items", + "core/attestation-capabilities.json#/properties/accepted_issuers/items/properties/credential_origins/items", + "core/attestation-capabilities.json#/properties/accepted_issuers/items/properties/proof_formats/items", + "core/attestation-capabilities.json#/properties/accepted_issuers/items/properties/resolvers/items/properties/url", + "core/attestation-capabilities.json#/properties/accepted_proof_formats/items", + "core/attestation-capabilities.json#/properties/accepted_verifiers/items/properties/agent_url", + "core/attestation-capabilities.json#/properties/accepted_verifiers/items/properties/claim_types/items", + "core/attestation-capabilities.json#/properties/accepted_verifiers/items/properties/proof_formats/items", + "core/attestation-evaluation.json#/properties/action_binding/properties/action_type", + "core/attestation-evaluation.json#/properties/evaluated_by", + "core/attestation-evaluation.json#/properties/proof_format", + "core/attestation-evaluation.json#/properties/verifier_agent_url", + "core/attestation-issuer.json#/oneOf/1/properties/agent_url", + "core/attestation-issuer.json#/oneOf/2/properties/origin", + "core/attestation-reference.json#/properties/claim_type", + "core/attestation-reference.json#/properties/embedded_credential/properties/format", + "core/attestation-reference.json#/properties/locator/oneOf/0/properties/credential_uri", + "core/attestation-reference.json#/properties/verify_agent/properties/agent_url", + "core/attestation-subject.json#/oneOf/1/properties/agent_url", + "core/attestation-subject.json#/oneOf/2/properties/namespace", + "core/attestation-subject.json#/oneOf/2/properties/resource_type", + "core/audience-activation-method.json#/oneOf/1/properties/buyer_agent/properties/agent_url", + "core/audience-characteristic.json#/properties/taxonomy/properties/system", + "core/audience-evidence-requirements.json#/properties/accepted_attestation_claim_types/items", + "core/audience-evidence.json#/properties/baseline/properties/system", + "core/audience-evidence.json#/properties/methodology_url", + "core/authorized-agent-base.json#/properties/url", + "core/brand-ref.json#/properties/data_subject_contestation/properties/url", + "core/brand-response-authorization-result.json#/properties/jwks_uri", + "core/buyer-onboarding-posture.json#/properties/url", + "core/canonical-audience-evidence.json#/properties/baseline/properties/system", + "core/canonical-audience-evidence.json#/properties/methodology_url", + "core/canonical-format-option.json#/properties/sample_render_url", + "core/capabilities-changed-webhook.json#/properties/agent_url", + "core/catalog.json#/properties/url", + "core/collection-list-ref.json#/properties/agent_url", + "core/collection.json#/properties/url", + "core/creative-item.json#/oneOf/0/properties/content_uri", + "core/creative-operation-format-declaration.json#/properties/sample_render_url", + "core/creative-policy.json#/properties/accepted_verifiers/items/properties/agent_url", + "core/deployment.json#/oneOf/1/properties/agent_url", + "core/destination-item.json#/properties/image_url", + "core/destination-item.json#/properties/url", + "core/destination.json#/oneOf/1/properties/agent_url", + "core/downstream-connection-requirement.json#/properties/authorization_url", + "core/downstream-connection-requirement.json#/properties/resource_ref/properties/post_url", + "core/downstream-connection-requirement.json#/properties/resource_ref/properties/profile_url", + "core/education-item.json#/properties/image_url", + "core/education-item.json#/properties/url", + "core/evaluator-spec.json#/oneOf/1/properties/agent_url", + "core/evaluator-spec.json#/properties/feature_agent/properties/agent_url", + "core/event.json#/properties/event_source_url", + "core/flight-item.json#/properties/image_url", + "core/flight-item.json#/properties/url", + "core/format-id.json#/properties/agent_url", + "core/format.json#/properties/example_url", + "core/generation-credential.json#/properties/endpoint", + "core/geo-place-catalog-capability.json#/properties/source", + "core/geo-place-resolver.json#/properties/url", + "core/geo-place-system.json#/anyOf/1", + "core/geo-place-type.json#/anyOf/1", + "core/hotel-item.json#/properties/image_url", + "core/hotel-item.json#/properties/url", + "core/insertion-order.json#/properties/signing_url", + "core/insertion-order.json#/properties/terms_url", + "core/inventory-list-application.json#/oneOf/0/properties/agent_url", + "core/inventory-list-application.json#/oneOf/1/properties/agent_url", + "core/job-item.json#/properties/apply_url", + "core/macro-declaration.json#/properties/dialect_namespace", + "core/macro-resolution-capability.json#/properties/dialect_namespace", + "core/macro-resolution-result.json#/properties/dialect_namespace", + "core/macro-translation-target.json#/properties/dialect_namespace", + "core/notification-config.json#/properties/url", + "core/offering.json#/properties/checkout_url", + "core/offering.json#/properties/landing_url", + "core/overlay.json#/properties/visual/properties/dark", + "core/overlay.json#/properties/visual/properties/light", + "core/overlay.json#/properties/visual/properties/url", + "core/pending-action.json#/properties/url", + "core/performance-feedback-assertion.json#/properties/evidence_ref", + "core/placement-evidence.json#/properties/url", + "core/placement-presentation.json#/definitions/image_decoration/properties/image_ref/properties/uri", + "core/platform-extension-ref.json#/properties/uri", + "core/presentation-ref.json#/properties/uri", + "core/preview-provider.json#/properties/agent_url", + "core/principal-changed-webhook.json#/properties/agent_url", + "core/principal-relationship.json#/properties/setup/properties/url", + "core/product-audience-evidence-requirements.json#/properties/accepted_attestation_claim_types/items", + "core/product-audience-evidence-requirements.json#/properties/accepted_attestation_issuers/items/oneOf/1/properties/agent_url", + "core/product-audience-evidence-requirements.json#/properties/accepted_attestation_issuers/items/oneOf/2/properties/origin", + "core/product-filters.json#/properties/audience_activation_methods/items/oneOf/1/properties/buyer_agent/properties/agent_url", + "core/product-filters.json#/properties/required_axe_integrations/items", + "core/product-filters.json#/properties/trusted_match/properties/providers/items/properties/agent_url", + "core/product-format-declaration.json#/properties/sample_render_url", + "core/product-offer-filters.json#/properties/trusted_match/properties/providers/items/properties/agent_url", + "core/product.json#/properties/material_submission/properties/url", + "core/product.json#/properties/trusted_match/properties/providers/items/properties/agent_url", + "core/property-list-ref.json#/properties/agent_url", + "core/provenance.json#/properties/c2pa/properties/manifest_url", + "core/provenance.json#/properties/declared_by/properties/agent_url", + "core/provenance.json#/properties/embedded_provenance/items/properties/verify_agent/properties/agent_url", + "core/provenance.json#/properties/verification/items/properties/details_url", + "core/provenance.json#/properties/watermarks/items/properties/verify_agent/properties/agent_url", + "core/push-notification-config.json#/properties/url", + "core/real-estate-item.json#/properties/image_url", + "core/real-estate-item.json#/properties/url", + "core/reference-asset.json#/properties/url", + "core/reference-renderer.json#/properties/provenance/properties/source_repository", + "core/registry-event.json#/$defs/agentProfilePayload/properties/agent_url", + "core/registry-event.json#/$defs/authorizationPayload/properties/agent_url", + "core/registry-event.json#/$defs/compliancePayload/properties/agent_url", + "core/registry-event.json#/$defs/publisherAdagentsPayload/properties/agents_added/items", + "core/registry-event.json#/$defs/publisherAdagentsPayload/properties/agents_removed/items", + "core/registry-event.json#/oneOf/10/properties/payload/properties/agent_url", + "core/registry-event.json#/oneOf/13/properties/payload/properties/agent_url", + "core/registry-event.json#/oneOf/14/properties/payload/properties/agent_url", + "core/registry-event.json#/oneOf/16/properties/payload/allOf/1/properties/agents_added/items", + "core/registry-event.json#/oneOf/16/properties/payload/allOf/1/properties/agents_removed/items", + "core/reporting-canonical-content-digest.json#/properties/canonicalization_uri", + "core/reporting-delivery-config-state.json#/properties/setup/properties/url", + "core/reporting-delivery-offering.json#/properties/report_definition_uri", + "core/reporting-delivery-offering.json#/properties/reporting_profile/properties/canonicalization_uri", + "core/reporting-delivery-offering.json#/properties/reporting_profile/properties/schema_uri", + "core/reporting-reliability-statistics.json#/properties/evidence/properties/attestation_uri", + "core/reporting-revision.json#/properties/report_definition_uri", + "core/reporting-revision.json#/properties/schema_uri", + "core/reporting-webhook.json#/properties/url", + "core/response-payload-jws-envelope.json#/definitions/response_payload/properties/agent_url", + "core/rights-constraint.json#/properties/rights_agent/properties/url", + "core/rights-constraint.json#/properties/verification_url", + "core/seller-agent-ref.json#/properties/agent_url", + "core/signal-definition-enrichment.json#/properties/criteria_url", + "core/signal-definition-enrichment.json#/properties/data_subject_rights/properties/ccpa_opt_out_url", + "core/signal-definition-enrichment.json#/properties/data_subject_rights/properties/channels/items/properties/url", + "core/signal-definition-enrichment.json#/properties/taxonomy/properties/ref", + "core/signal-definition.json#/properties/criteria_url", + "core/signal-definition.json#/properties/data_subject_rights/properties/ccpa_opt_out_url", + "core/signal-definition.json#/properties/data_subject_rights/properties/channels/items/properties/url", + "core/signal-definition.json#/properties/taxonomy/properties/ref", + "core/signal-id.json#/oneOf/1/properties/agent_url", + "core/signal-listing.json#/properties/methodology_url", + "core/signal-modeling-disclosure.json#/properties/jurisdictions/items/properties/disclosure_url", + "core/signal-ref.json#/oneOf/2/properties/signal_source_url", + "core/store-item.json#/properties/url", + "core/talent.json#/properties/brand_url", + "core/transformer.json#/properties/voice_synthesis_ref/items/properties/brand_agent/properties/url", + "core/vehicle-item.json#/properties/image_url", + "core/vehicle-item.json#/properties/url", + "core/verification-token-claims.json#/properties/agent_url", + "core/verification-token-claims.json#/properties/sub", + "core/webhook-activity-record.json#/properties/url", + "core/webhook-challenge.json#/properties/seller_agent_url", + "creative/audit-observation.json#/properties/details/properties/agent_url", + "creative/audit-observation.json#/properties/details/properties/substituted_for", + "creative/get-creative-features-terminal-success.json#/properties/detail_url", + "creative/list-creative-formats-response.json#/properties/creative_agents/items/properties/agent_url", + "creative/preview-creative-response.json#/oneOf/0/properties/interactive_url", + "creative/preview-creative-response.json#/oneOf/1/properties/results/items/properties/response/properties/interactive_url", + "creative/preview-render.json#/oneOf/0/properties/preview_url", + "creative/preview-render.json#/oneOf/2/properties/preview_url", + "creative/sync-creatives-response.json#/oneOf/0/properties/creatives/items/properties/preview_url", + "creative/validate-input-request.json#/properties/targets/items/oneOf/2/properties/id", + "error-details/account-setup-required.json#/properties/setup_url", + "error-details/authorization-required.json#/properties/authorization_url", + "error-details/creative-rejected.json#/properties/policy_url", + "error-details/policy-violation.json#/properties/policy_url", + "error-details/stale-response.json#/properties/upstream/properties/url", + "error-details/vendor-error-codes.json#/properties/vendors/additionalProperties/properties/url", + "extensions/extension-meta.json#/properties/docs_url", + "governance/check-governance-request.json#/properties/caller", + "governance/check-governance-request.json#/properties/target_agent", + "governance/get-plan-audit-logs-response.json#/properties/plans/items/properties/entries/items/properties/caller", + "governance/get-plan-audit-logs-response.json#/properties/plans/items/properties/entries/items/properties/reviewed_by", + "governance/policy-entry.json#/properties/source_url", + "governance/sync-plans-request.json#/properties/plans/items/properties/approved_sellers/items", + "governance/sync-plans-request.json#/properties/plans/items/properties/delegations/items/properties/agent_url", + "media-buy/build-creative-response.json#/oneOf/0/properties/preview/properties/interactive_url", + "media-buy/build-creative-response.json#/oneOf/1/properties/preview/properties/interactive_url", + "media-buy/create-media-buy-request.json#/properties/artifact_webhook/properties/url", + "media-buy/list-creative-formats-response.json#/properties/creative_agents/items/properties/agent_url", + "property/authorization-result.json#/properties/sales_agent_url", + "property/delivery-record.json#/properties/sales_agent_url", + "property/property-feature-definition.json#/properties/methodology_url", + "property/property-list.json#/properties/webhook_url", + "property/update-property-list-request.json#/properties/webhook_url", + "property/validate-property-delivery-response.json#/properties/aggregate/properties/methodology_url", + "protocol/get-adcp-capabilities-response.json#/properties/account/properties/authorization_endpoint", + "protocol/get-adcp-capabilities-response.json#/properties/governance/properties/creative_features/items/properties/methodology_url", + "protocol/get-adcp-capabilities-response.json#/properties/governance/properties/property_features/items/properties/methodology_url", + "protocol/get-adcp-capabilities-response.json#/properties/governance/properties/runtime_attestations/properties/signal_activation/properties/claim_types/items", + "protocol/get-adcp-capabilities-response.json#/properties/identity/properties/brand_json_url", + "protocol/get-adcp-capabilities-response.json#/properties/identity/properties/key_origins/properties/governance_signing", + "protocol/get-adcp-capabilities-response.json#/properties/identity/properties/key_origins/properties/request_signing", + "protocol/get-adcp-capabilities-response.json#/properties/identity/properties/key_origins/properties/tmp_signing", + "protocol/get-adcp-capabilities-response.json#/properties/identity/properties/key_origins/properties/webhook_signing", + "protocol/get-adcp-capabilities-response.json#/properties/measurement/properties/metrics/items/properties/accreditations/items/properties/evidence_url", + "protocol/get-adcp-capabilities-response.json#/properties/measurement/properties/metrics/items/properties/methodology_url", + "protocol/get-adcp-capabilities-response.json#/properties/measurement/properties/metrics/items/properties/standard_reference", + "protocol/get-adcp-capabilities-response.json#/properties/media_buy/properties/acceptance_policy_discovery/properties/catalog_url", + "protocol/get-adcp-capabilities-response.json#/properties/media_buy/properties/execution/properties/axe_integrations/items", + "protocol/get-adcp-capabilities-response.json#/properties/sponsored_intelligence/properties/brand_url", + "protocol/get-adcp-capabilities-response.json#/properties/sponsored_intelligence/properties/endpoint/properties/transports/items/properties/url", + "sponsored-intelligence/si-get-offering-response.json#/properties/matching_products/items/properties/image_url", + "sponsored-intelligence/si-get-offering-response.json#/properties/matching_products/items/properties/url", + "sponsored-intelligence/si-get-offering-response.json#/properties/offering/properties/image_url", + "sponsored-intelligence/si-get-offering-response.json#/properties/offering/properties/landing_url", + "sponsored-intelligence/si-identity.json#/properties/privacy_policy_acknowledged/properties/brand_policy_url", + "sponsored-intelligence/si-sponsored-context.json#/properties/declared_by/properties/agent_url", + "sponsored-intelligence/si-terminate-session-response.json#/properties/acp_handoff/properties/checkout_url", + "sponsored-intelligence/si-ui-element.json#/allOf/1/then/properties/data/properties/url", + "sponsored-intelligence/si-ui-element.json#/allOf/2/then/properties/data/properties/url", + "sponsored-intelligence/si-ui-element.json#/allOf/3/then/properties/data/properties/image_url", + "sponsored-intelligence/si-ui-element.json#/allOf/6/then/properties/apps/additionalProperties/properties/url", + "sponsored-intelligence/si-ui-element.json#/allOf/7/then/properties/data/properties/actions/items/properties/url", + "trust/v1/trust-acknowledgements.json#/properties/next", + "trust/v1/trust.json#/definitions/https_url", + "trusted-match/context-match-request.json#/properties/$schema", + "trusted-match/context-match-request.json#/properties/seller_agent_url", + "trusted-match/identity-match-request.json#/properties/$schema", + "trusted-match/identity-match-request.json#/properties/seller_agent_url", + "trusted-match/provider-registration.json#/properties/endpoint" + ], + "inline_property_lists": [ + {"file":"aao/agent-publishers.json","pointer":"/properties/publishers","list_kind":"property","carriage":"document","side":"other","stability":"stable","bounded":false,"max_items":null}, + {"file":"aao/agent-publishers.json","pointer":"/definitions/PublisherEntry/properties/property_ids","list_kind":"property","carriage":"document","side":"other","stability":"stable","bounded":false,"max_items":null}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/properties","list_kind":"property","carriage":"document","side":"other","stability":"stable","bounded":false,"max_items":null}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/revoked_publisher_domains","list_kind":"property","carriage":"document","side":"other","stability":"stable","bounded":false,"max_items":null}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/collections","list_kind":"collection","carriage":"document","side":"other","stability":"stable","bounded":false,"max_items":null}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/formats/items/allOf/1/properties/applies_to_property_ids","list_kind":"property","carriage":"document","side":"other","stability":"stable","bounded":false,"max_items":null}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/formats/items/allOf/1/properties/applies_to_property_tags","list_kind":"property","carriage":"document","side":"other","stability":"stable","bounded":false,"max_items":null}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/0/properties/property_ids","list_kind":"property","carriage":"document","side":"other","stability":"stable","bounded":false,"max_items":null}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/0/properties/collections","list_kind":"collection","carriage":"document","side":"other","stability":"stable","bounded":false,"max_items":null}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/1/properties/property_tags","list_kind":"property","carriage":"document","side":"other","stability":"stable","bounded":false,"max_items":null}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/1/properties/collections","list_kind":"collection","carriage":"document","side":"other","stability":"stable","bounded":false,"max_items":null}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/2/properties/properties","list_kind":"property","carriage":"document","side":"other","stability":"stable","bounded":false,"max_items":null}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/2/properties/collections","list_kind":"collection","carriage":"document","side":"other","stability":"stable","bounded":false,"max_items":null}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/3/properties/publisher_properties","list_kind":"property","carriage":"document","side":"other","stability":"stable","bounded":false,"max_items":null}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/3/properties/collections","list_kind":"collection","carriage":"document","side":"other","stability":"stable","bounded":false,"max_items":null}, + {"file":"brand.json","pointer":"/definitions/brand/properties/properties","list_kind":"property","carriage":"document","side":"other","stability":"stable","bounded":false,"max_items":null}, + {"file":"brand.json","pointer":"/definitions/brand/properties/collections","list_kind":"collection","carriage":"document","side":"other","stability":"stable","bounded":false,"max_items":null}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/collections","list_kind":"collection","carriage":"response-field","side":"response","stability":"experimental","bounded":false,"max_items":null}, + {"file":"collection/base-collection-source.json","pointer":"/oneOf/0/properties/identifiers","list_kind":"collection","carriage":"list-authoring","side":"both","stability":"stable","bounded":false,"max_items":null}, + {"file":"collection/collection-list-filters.json","pointer":"/properties/exclude_distribution_ids","list_kind":"collection","carriage":"list-authoring","side":"both","stability":"stable","bounded":false,"max_items":null}, + {"file":"collection/collection-list.json","pointer":"/properties/base_collections","list_kind":"collection","carriage":"list-authoring","side":"response","stability":"stable","bounded":false,"max_items":null}, + {"file":"collection/create-collection-list-request.json","pointer":"/properties/base_collections","list_kind":"collection","carriage":"list-authoring","side":"request","stability":"stable","bounded":false,"max_items":null}, + {"file":"collection/update-collection-list-request.json","pointer":"/properties/base_collections","list_kind":"collection","carriage":"list-authoring","side":"request","stability":"stable","bounded":false,"max_items":null}, + {"file":"core/canonical-product.json","pointer":"/properties/publisher_properties","list_kind":"property","carriage":"response-field","side":"response","stability":"stable","bounded":false,"max_items":null}, + {"file":"core/canonical-product.json","pointer":"/properties/collections","list_kind":"collection","carriage":"response-field","side":"response","stability":"stable","bounded":false,"max_items":null}, + {"file":"core/collection-distribution.json","pointer":"/properties/property_ids","list_kind":"property","carriage":"response-field","side":"both","stability":"stable","bounded":false,"max_items":null}, + {"file":"core/collection-selection.json","pointer":"/oneOf/0/properties/collections","list_kind":"collection","carriage":"selector","side":"both","stability":"stable","bounded":false,"max_items":null}, + {"file":"core/placement-definition.json","pointer":"/properties/property_ids","list_kind":"property","carriage":"response-field","side":"other","stability":"stable","bounded":false,"max_items":null}, + {"file":"core/placement-definition.json","pointer":"/properties/property_tags","list_kind":"property","carriage":"response-field","side":"other","stability":"stable","bounded":false,"max_items":null}, + {"file":"core/product.json","pointer":"/properties/publisher_properties","list_kind":"property","carriage":"response-field","side":"both","stability":"stable","bounded":false,"max_items":null}, + {"file":"core/product.json","pointer":"/properties/collections","list_kind":"collection","carriage":"response-field","side":"both","stability":"stable","bounded":false,"max_items":null}, + {"file":"core/publisher-property-selector.json","pointer":"/oneOf/0/properties/publisher_domains","list_kind":"property","carriage":"selector","side":"both","stability":"stable","bounded":false,"max_items":null}, + {"file":"core/publisher-property-selector.json","pointer":"/oneOf/1/properties/property_ids","list_kind":"property","carriage":"selector","side":"both","stability":"stable","bounded":false,"max_items":null}, + {"file":"core/publisher-property-selector.json","pointer":"/oneOf/2/properties/publisher_domains","list_kind":"property","carriage":"selector","side":"both","stability":"stable","bounded":false,"max_items":null}, + {"file":"core/publisher-property-selector.json","pointer":"/oneOf/2/properties/property_tags","list_kind":"property","carriage":"selector","side":"both","stability":"stable","bounded":false,"max_items":null}, + {"file":"core/registry-event.json","pointer":"/oneOf/10/properties/payload/properties/removed_from_publishers","list_kind":"property","carriage":"document","side":"response","stability":"stable","bounded":false,"max_items":null}, + {"file":"core/registry-event.json","pointer":"/$defs/authorizationPayload/properties/property_ids","list_kind":"property","carriage":"document","side":"response","stability":"stable","bounded":false,"max_items":null}, + {"file":"core/registry-event.json","pointer":"/$defs/authorizationPayload/properties/property_tags","list_kind":"property","carriage":"document","side":"response","stability":"stable","bounded":false,"max_items":null}, + {"file":"core/registry-event.json","pointer":"/$defs/authorizationPayload/properties/properties","list_kind":"property","carriage":"document","side":"response","stability":"stable","bounded":false,"max_items":null}, + {"file":"core/registry-event.json","pointer":"/$defs/authorizationPayload/properties/publisher_properties","list_kind":"property","carriage":"document","side":"response","stability":"stable","bounded":false,"max_items":null}, + {"file":"core/registry-event.json","pointer":"/$defs/authorizationPayload/properties/collections","list_kind":"collection","carriage":"document","side":"response","stability":"stable","bounded":false,"max_items":null}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/collections","list_kind":"collection","carriage":"response-field","side":"both","stability":"experimental","bounded":false,"max_items":null}, + {"file":"media-buy/list-collections-request.json","pointer":"/properties/collections","list_kind":"collection","carriage":"request-field","side":"request","stability":"experimental","bounded":true,"max_items":100}, + {"file":"media-buy/list-collections-response.json","pointer":"/properties/collections","list_kind":"collection","carriage":"response-field","side":"response","stability":"experimental","bounded":false,"max_items":null}, + {"file":"media-buy/list-products-response.json","pointer":"/properties/collections","list_kind":"collection","carriage":"response-field","side":"response","stability":"experimental","bounded":false,"max_items":null}, + {"file":"media-buy/refine-proposals-response.json","pointer":"/properties/collections","list_kind":"collection","carriage":"response-field","side":"response","stability":"experimental","bounded":false,"max_items":null}, + {"file":"media-buy/request-proposals-response.json","pointer":"/properties/collections","list_kind":"collection","carriage":"response-field","side":"response","stability":"experimental","bounded":false,"max_items":null}, + {"file":"property/base-property-source.json","pointer":"/oneOf/1/properties/property_ids","list_kind":"property","carriage":"list-authoring","side":"both","stability":"stable","bounded":false,"max_items":null}, + {"file":"property/base-property-source.json","pointer":"/oneOf/2/properties/identifiers","list_kind":"property","carriage":"list-authoring","side":"both","stability":"stable","bounded":false,"max_items":null}, + {"file":"property/create-property-list-request.json","pointer":"/properties/base_properties","list_kind":"property","carriage":"list-authoring","side":"request","stability":"stable","bounded":false,"max_items":null}, + {"file":"property/property-list-filters.json","pointer":"/properties/exclude_identifiers","list_kind":"property","carriage":"list-authoring","side":"both","stability":"stable","bounded":false,"max_items":null}, + {"file":"property/property-list.json","pointer":"/properties/base_properties","list_kind":"property","carriage":"list-authoring","side":"response","stability":"stable","bounded":false,"max_items":null}, + {"file":"property/update-property-list-request.json","pointer":"/properties/base_properties","list_kind":"property","carriage":"list-authoring","side":"request","stability":"stable","bounded":false,"max_items":null}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/portfolio/properties/publisher_domains","list_kind":"property","carriage":"response-field","side":"response","stability":"stable","bounded":false,"max_items":null}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/signals/properties/data_provider_domains","list_kind":"property","carriage":"response-field","side":"response","stability":"stable","bounded":false,"max_items":null}, + {"file":"trusted-match/provider-registration.json","pointer":"/properties/properties","list_kind":"property","carriage":"response-field","side":"other","stability":"experimental","bounded":false,"max_items":null} + ], + "entries": [ + {"file":"a2ui/bound-value.json","pointer":"/oneOf/0/properties/literalString","kind":"string","property":"literalString","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"a2ui/bound-value.json","pointer":"/oneOf/3/properties/path","kind":"string","property":"path","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"a2ui/bound-value.json","pointer":"/oneOf/4/properties/literalString","kind":"string","property":"literalString","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"a2ui/bound-value.json","pointer":"/oneOf/4/properties/path","kind":"string","property":"path","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"a2ui/component.json","pointer":"/properties/id","kind":"string","property":"id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"a2ui/component.json","pointer":"/properties/parentId","kind":"string","property":"parentId","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"a2ui/si-catalog.json","pointer":"/properties/components","kind":"array","property":"components","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (11 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"a2ui/si-catalog.json","pointer":"/definitions/Button/properties/action/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"a2ui/si-catalog.json","pointer":"/definitions/Card/properties/action/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"a2ui/si-catalog.json","pointer":"/definitions/Card/properties/children","kind":"array","property":"children","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"a2ui/si-catalog.json","pointer":"/definitions/Card/properties/children/items","kind":"string","property":"children","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"a2ui/si-catalog.json","pointer":"/definitions/ProductCard/properties/action/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"a2ui/si-catalog.json","pointer":"/definitions/List/properties/template/properties/componentId","kind":"string","property":"componentId","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"a2ui/si-catalog.json","pointer":"/definitions/Row/properties/children","kind":"array","property":"children","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"a2ui/si-catalog.json","pointer":"/definitions/Row/properties/children/items","kind":"string","property":"children","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"a2ui/si-catalog.json","pointer":"/definitions/Row/properties/gap","kind":"string","property":"gap","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"a2ui/si-catalog.json","pointer":"/definitions/Column/properties/children","kind":"array","property":"children","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"a2ui/si-catalog.json","pointer":"/definitions/Column/properties/children/items","kind":"string","property":"children","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"a2ui/si-catalog.json","pointer":"/definitions/Column/properties/gap","kind":"string","property":"gap","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"a2ui/si-catalog.json","pointer":"/definitions/AppHandoff/properties/apps/additionalProperties/properties/appId","kind":"string","property":"appId","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"a2ui/si-catalog.json","pointer":"/definitions/AppHandoff/properties/apps/additionalProperties/properties/deepLink","kind":"string","property":"deepLink","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"a2ui/surface.json","pointer":"/properties/surfaceId","kind":"string","property":"surfaceId","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"a2ui/surface.json","pointer":"/properties/catalogId","kind":"string","property":"catalogId","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"a2ui/surface.json","pointer":"/properties/components","kind":"array","property":"components","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/a2ui/component.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"a2ui/surface.json","pointer":"/properties/rootId","kind":"string","property":"rootId","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"a2ui/user-action.json","pointer":"/properties/surfaceId","kind":"string","property":"surfaceId","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"a2ui/user-action.json","pointer":"/properties/componentId","kind":"string","property":"componentId","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"a2ui/user-action.json","pointer":"/properties/action/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"aao/agent-publishers.json","pointer":"/properties/publishers","kind":"array","property":"publishers","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/PublisherEntry","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"aao/agent-publishers.json","pointer":"/properties/next_cursor","kind":"string","property":"next_cursor","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"aao/agent-publishers.json","pointer":"/definitions/PublisherEntry/allOf/0/then/properties/manager_domain","kind":"string","property":"manager_domain","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"aao/agent-publishers.json","pointer":"/definitions/PublisherEntry/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"aao/agent-publishers.json","pointer":"/definitions/PublisherEntry/properties/manager_domain","kind":"string","property":"manager_domain","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"aao/agent-publishers.json","pointer":"/definitions/PublisherEntry/properties/property_ids","kind":"array","property":"property_ids","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"aao/agent-publishers.json","pointer":"/definitions/PublisherEntry/properties/property_ids/items","kind":"string","property":"property_ids","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"account/get-account-financials-response.json","pointer":"/oneOf/0/properties/timezone","kind":"string","property":"timezone","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"account/get-account-financials-response.json","pointer":"/oneOf/0/properties/invoices","kind":"array","property":"invoices","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"account/get-account-financials-response.json","pointer":"/oneOf/0/properties/invoices/items/properties/invoice_id","kind":"string","property":"invoice_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"account/get-account-financials-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"account/list-accounts-response.json","pointer":"/properties/accounts","kind":"array","property":"accounts","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/account-with-authorization.json","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"account/list-accounts-response.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"account/report-usage-request.json","pointer":"/properties/idempotency_key","kind":"string","property":"idempotency_key","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"account/report-usage-request.json","pointer":"/properties/usage","kind":"array","property":"usage","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"account/report-usage-request.json","pointer":"/properties/usage/items/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"account/report-usage-request.json","pointer":"/properties/usage/items/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"account/report-usage-request.json","pointer":"/properties/usage/items/properties/signal_agent_segment_id","kind":"string","property":"signal_agent_segment_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"account/report-usage-request.json","pointer":"/properties/usage/items/properties/standards_id","kind":"string","property":"standards_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"account/report-usage-request.json","pointer":"/properties/usage/items/properties/rights_id","kind":"string","property":"rights_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"account/report-usage-request.json","pointer":"/properties/usage/items/properties/creative_id","kind":"string","property":"creative_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"account/report-usage-request.json","pointer":"/properties/usage/items/properties/build_variant_id","kind":"string","property":"build_variant_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"account/report-usage-request.json","pointer":"/properties/usage/items/properties/property_list_id","kind":"string","property":"property_list_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"account/report-usage-response.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"account/sync-accounts-request.json","pointer":"/properties/accounts/items/properties/operator","kind":"string","property":"operator","side":"request","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"account/sync-accounts-request.json","pointer":"/properties/accounts/items/properties/timezone","kind":"string","property":"timezone","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"account/sync-accounts-response.json","pointer":"/oneOf/0/properties/accounts","kind":"array","property":"accounts","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"account/sync-accounts-response.json","pointer":"/oneOf/0/properties/accounts/items/properties/account_id","kind":"string","property":"account_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"account/sync-accounts-response.json","pointer":"/oneOf/0/properties/accounts/items/properties/operator","kind":"string","property":"operator","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"account/sync-accounts-response.json","pointer":"/oneOf/0/properties/accounts/items/properties/timezone","kind":"string","property":"timezone","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"account/sync-accounts-response.json","pointer":"/oneOf/0/properties/accounts/items/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"account/sync-accounts-response.json","pointer":"/oneOf/0/properties/accounts/items/properties/setup/properties/message","kind":"string","property":"message","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"account/sync-accounts-response.json","pointer":"/oneOf/0/properties/accounts/items/properties/rate_card","kind":"string","property":"rate_card","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"account/sync-accounts-response.json","pointer":"/oneOf/0/properties/accounts/items/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"account/sync-accounts-response.json","pointer":"/oneOf/0/properties/accounts/items/properties/warnings","kind":"array","property":"warnings","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"account/sync-accounts-response.json","pointer":"/oneOf/0/properties/accounts/items/properties/warnings/items","kind":"string","property":"warnings","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"account/sync-accounts-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"account/sync-governance-request.json","pointer":"/properties/accounts/items/properties/governance_agents/items/properties/authentication/properties/credentials","kind":"string","property":"credentials","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"account/sync-governance-response.json","pointer":"/oneOf/0/properties/accounts","kind":"array","property":"accounts","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"account/sync-governance-response.json","pointer":"/oneOf/0/properties/accounts/items/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"account/sync-governance-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/0/properties/$schema","kind":"string","property":"$schema","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2048,"tier":"string-url","rationale":"JSON Schema URI.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/$schema","kind":"string","property":"$schema","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2048,"tier":"string-url","rationale":"JSON Schema URI.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/contact/properties/domain","kind":"string","property":"domain","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/properties","kind":"array","property":"properties","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/property.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/revoked_publisher_domains","kind":"array","property":"revoked_publisher_domains","side":"other","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/revoked_publisher_domains/items/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/collections","kind":"array","property":"collections","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/collection.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/placements","kind":"array","property":"placements","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/placement-definition.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/formats","kind":"array","property":"formats","side":"other","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/formats/items/allOf/1/properties/applies_to_property_ids","kind":"array","property":"applies_to_property_ids","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/property-id.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/formats/items/allOf/1/properties/applies_to_property_tags","kind":"array","property":"applies_to_property_tags","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/property-tag.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/formats/items/allOf/1/properties/format_revision","kind":"string","property":"format_revision","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/tags/additionalProperties/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/tags/additionalProperties/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/placement_tags/additionalProperties/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/placement_tags/additionalProperties/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents","kind":"array","property":"authorized_agents","side":"other","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/0/properties/property_ids","kind":"array","property":"property_ids","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/property-id.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/0/properties/collections","kind":"array","property":"collections","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/collection-selector.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/0/properties/placement_ids","kind":"array","property":"placement_ids","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/0/properties/placement_ids/items","kind":"string","property":"placement_ids","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/0/properties/placement_tags","kind":"array","property":"placement_tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/0/properties/placement_tags/items","kind":"string","property":"placement_tags","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/0/properties/countries","kind":"array","property":"countries","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/1/properties/property_tags","kind":"array","property":"property_tags","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/property-tag.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/1/properties/collections","kind":"array","property":"collections","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/collection-selector.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/1/properties/placement_ids","kind":"array","property":"placement_ids","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/1/properties/placement_ids/items","kind":"string","property":"placement_ids","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/1/properties/placement_tags","kind":"array","property":"placement_tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/1/properties/placement_tags/items","kind":"string","property":"placement_tags","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/1/properties/countries","kind":"array","property":"countries","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/2/properties/properties","kind":"array","property":"properties","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/property.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/2/properties/collections","kind":"array","property":"collections","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/collection-selector.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/2/properties/placement_ids","kind":"array","property":"placement_ids","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/2/properties/placement_ids/items","kind":"string","property":"placement_ids","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/2/properties/placement_tags","kind":"array","property":"placement_tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/2/properties/placement_tags/items","kind":"string","property":"placement_tags","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/2/properties/countries","kind":"array","property":"countries","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/3/properties/publisher_properties","kind":"array","property":"publisher_properties","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/publisher-property-selector.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/3/properties/collections","kind":"array","property":"collections","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/collection-selector.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/3/properties/placement_ids","kind":"array","property":"placement_ids","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/3/properties/placement_ids/items","kind":"string","property":"placement_ids","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/3/properties/placement_tags","kind":"array","property":"placement_tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/3/properties/placement_tags/items","kind":"string","property":"placement_tags","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/3/properties/countries","kind":"array","property":"countries","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/4/properties/signal_ids","kind":"array","property":"signal_ids","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/4/properties/signal_ids/items","kind":"string","property":"signal_ids","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/5/properties/signal_tags","kind":"array","property":"signal_tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/authorized_agents/items/oneOf/5/properties/signal_tags/items","kind":"string","property":"signal_tags","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9_-]+$","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/property_features","kind":"array","property":"property_features","side":"other","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/property_features/items/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/property_features/items/properties/features","kind":"array","property":"features","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/property_features/items/properties/features/items","kind":"string","property":"features","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/property_features/items/properties/publisher_id","kind":"string","property":"publisher_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/signals","kind":"array","property":"signals","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/signal-definition.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/signal_tags/additionalProperties/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"adagents.json","pointer":"/oneOf/1/properties/signal_tags/additionalProperties/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/oneOf/0/properties/$schema","kind":"string","property":"$schema","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2048,"tier":"string-url","rationale":"JSON Schema URI.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/oneOf/0/properties/note","kind":"string","property":"note","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/oneOf/1/properties/$schema","kind":"string","property":"$schema","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2048,"tier":"string-url","rationale":"JSON Schema URI.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/oneOf/1/properties/note","kind":"string","property":"note","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/oneOf/2/properties/$schema","kind":"string","property":"$schema","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2048,"tier":"string-url","rationale":"JSON Schema URI.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/oneOf/2/properties/version","kind":"string","property":"version","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/oneOf/3/properties/$schema","kind":"string","property":"$schema","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2048,"tier":"string-url","rationale":"JSON Schema URI.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/oneOf/3/properties/version","kind":"string","property":"version","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/oneOf/3/properties/brands","kind":"array","property":"brands","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/brand","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/oneOf/3/properties/brand_refs","kind":"array","property":"brand_refs","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/portfolio_entry","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/oneOf/3/properties/authorized_operators","kind":"array","property":"authorized_operators","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/authorized_operator","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/oneOf/3/properties/trademarks","kind":"array","property":"trademarks","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/trademark","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/oneOf/4/allOf/0/properties/$schema","kind":"string","property":"$schema","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2048,"tier":"string-url","rationale":"JSON Schema URI.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/oneOf/4/allOf/0/properties/version","kind":"string","property":"version","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/domain","kind":"string","property":"domain","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand_id","kind":"string","property":"brand_id","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9_]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/logo_id","kind":"string","property":"logo_id","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9][a-z0-9_-]*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/trademark/properties/registry","kind":"string","property":"registry","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/trademark/properties/number","kind":"string","property":"number","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/trademark/properties/mark","kind":"string","property":"mark","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/trademark/properties/countries","kind":"array","property":"countries","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/trademark/properties/nice_classes","kind":"array","property":"nice_classes","side":"other","stability":"stable","in_last_stable":"yes","items":"integer","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/localized_name/additionalProperties","kind":"string","property":"localized_name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/localized_scalar/oneOf/0","kind":"string","property":"localized_scalar","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/localized_scalar/oneOf/1","kind":"array","property":"localized_scalar","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/localized_name","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/localized_string_list_entry/additionalProperties","kind":"array","property":"localized_string_list_entry","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/localized_string_list_entry/additionalProperties/items","kind":"string","property":"localized_string_list_entry","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/localized_string_list/oneOf/0","kind":"array","property":"localized_string_list","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/localized_string_list/oneOf/0/items","kind":"string","property":"localized_string_list","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/localized_string_list/oneOf/1","kind":"array","property":"localized_string_list","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/localized_string_list_entry","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/logo/properties/tags","kind":"array","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/logo/properties/tags/items","kind":"string","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/logo/properties/slots","kind":"array","property":"slots","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/logo_slot","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (13 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/logo/properties/usage","kind":"string","property":"usage","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/color_value/oneOf/1","kind":"array","property":"color_value","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/color_ref/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/font_role/oneOf/0","kind":"string","property":"font_role","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/font_role/oneOf/1/properties/family","kind":"string","property":"family","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/asset/properties/asset_id","kind":"string","property":"asset_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/asset/properties/tags","kind":"array","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/asset/properties/tags/items","kind":"string","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/asset/properties/format","kind":"string","property":"format","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/property/properties/identifier","kind":"string","property":"identifier","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/product_catalog/properties/categories","kind":"array","property":"categories","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/product_catalog/properties/categories/items","kind":"string","property":"categories","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/product_catalog/properties/agentic_checkout/properties/spec","kind":"string","property":"spec","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/product_catalog/properties/agentic_checkout/properties/supported_payment_providers","kind":"array","property":"supported_payment_providers","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/product_catalog/properties/agentic_checkout/properties/supported_payment_providers/items","kind":"string","property":"supported_payment_providers","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/data_subject_contestation/properties/languages","kind":"array","property":"languages","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 639 / BCP 47 language codes (184 two-letter languages): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/data_subject_contestation/properties/languages/items","kind":"string","property":"languages","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/identity_relying_parties","kind":"array","property":"identity_relying_parties","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/identity_relying_party","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/names","kind":"array","property":"names","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/localized_name","proposed_limit":32,"tier":"array-small","rationale":"Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/industries","kind":"array","property":"industries","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/industries/items","kind":"string","property":"industries","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/target_audience","kind":"string","property":"target_audience","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/logos","kind":"array","property":"logos","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/logo","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/tone/oneOf/0","kind":"string","property":"tone","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/tagline/oneOf/0","kind":"string","property":"tagline","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"One-line marketing text.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/tagline/oneOf/1","kind":"array","property":"tagline","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/localized_name","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/assets","kind":"array","property":"assets","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/asset","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/properties","kind":"array","property":"properties","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/property","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/disclaimers","kind":"array","property":"disclaimers","side":"other","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/disclaimers/items/properties/text","kind":"string","property":"text","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/disclaimers/items/properties/context","kind":"string","property":"context","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/trademarks","kind":"array","property":"trademarks","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/trademark","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/voice_synthesis/properties/provider","kind":"string","property":"provider","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/voice_synthesis/properties/voice_id","kind":"string","property":"voice_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/avatar/properties/provider","kind":"string","property":"provider","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/avatar/properties/avatar_id","kind":"string","property":"avatar_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/contact/properties/phone","kind":"string","property":"phone","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":30,"tier":"string-code","rationale":"Matches the phone fields already bounded at 30.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/collections","kind":"array","property":"collections","side":"other","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/collections/items/properties/collection_id","kind":"string","property":"collection_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand/properties/collections/items/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/house/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/house/properties/names","kind":"array","property":"names","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/localized_name","proposed_limit":32,"tier":"array-small","rationale":"Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/house/properties/identity_relying_parties","kind":"array","property":"identity_relying_parties","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/identity_relying_party","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand_agent/properties/id","kind":"string","property":"id","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9_]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/rights_agent/properties/id","kind":"string","property":"id","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9_]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/rights_agent/properties/available_uses","kind":"array","property":"available_uses","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/right-use.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (12 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/rights_agent/properties/right_types","kind":"array","property":"right_types","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/right-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/rights_agent/properties/countries","kind":"array","property":"countries","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand_agent_entry/properties/available_uses","kind":"array","property":"available_uses","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/right-use.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (12 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand_agent_entry/properties/right_types","kind":"array","property":"right_types","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/right-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand_agent_entry/properties/countries","kind":"array","property":"countries","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/agents","kind":"array","property":"agents","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/brand_agent_entry","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/authorized_operator/properties/brands","kind":"array","property":"brands","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/authorized_operator/properties/brands/items","kind":"string","property":"brands","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^([a-z0-9_]+|\\*)$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/authorized_operator/properties/countries","kind":"array","property":"countries","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/authorized_operator/properties/scopes","kind":"array","property":"scopes","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/photography_style/properties/lighting","kind":"string","property":"lighting","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/photography_style/properties/subject/properties/people/properties/age_range","kind":"string","property":"age_range","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/photography_style/properties/subject/properties/people/properties/diversity","kind":"string","property":"diversity","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/photography_style/properties/subject/properties/people/properties/mood","kind":"array","property":"mood","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/photography_style/properties/subject/properties/people/properties/mood/items","kind":"string","property":"mood","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/photography_style/properties/subject/properties/setting","kind":"string","property":"setting","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/photography_style/properties/framing/properties/subject_position","kind":"string","property":"subject_position","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/photography_style/properties/framing/properties/crop_style","kind":"string","property":"crop_style","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/photography_style/properties/framing/properties/perspective","kind":"string","property":"perspective","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/photography_style/properties/preferred_aspect_ratios","kind":"array","property":"preferred_aspect_ratios","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/photography_style/properties/preferred_aspect_ratios/items","kind":"string","property":"preferred_aspect_ratios","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^\\d+:\\d+$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/photography_style/properties/tags","kind":"array","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/photography_style/properties/tags/items","kind":"string","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/graphic_style/properties/stroke_weight","kind":"string","property":"stroke_weight","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/graphic_style/properties/corner_radius","kind":"string","property":"corner_radius","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/graphic_style/properties/tags","kind":"array","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/graphic_style/properties/tags/items","kind":"string","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/border_radius/additionalProperties","kind":"string","property":"border_radius","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/border_radius/properties/none","kind":"string","property":"none","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/border_radius/properties/default","kind":"string","property":"default","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/border_radius/properties/small","kind":"string","property":"small","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/border_radius/properties/large","kind":"string","property":"large","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/border_radius/properties/pill","kind":"string","property":"pill","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/elevation/additionalProperties","kind":"string","property":"elevation","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/elevation/properties/none","kind":"string","property":"none","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/elevation/properties/subtle","kind":"string","property":"subtle","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/elevation/properties/card","kind":"string","property":"card","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/elevation/properties/modal","kind":"string","property":"modal","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/spacing/properties/unit","kind":"string","property":"unit","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/spacing/properties/scale/additionalProperties","kind":"string","property":"scale","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/spacing/properties/scale/properties/xs","kind":"string","property":"xs","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/spacing/properties/scale/properties/sm","kind":"string","property":"sm","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/spacing/properties/scale/properties/md","kind":"string","property":"md","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/spacing/properties/scale/properties/lg","kind":"string","property":"lg","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/spacing/properties/scale/properties/xl","kind":"string","property":"xl","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/spacing/properties/scale/properties/2xl","kind":"string","property":"2xl","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand_shapes/properties/primary_shape","kind":"string","property":"primary_shape","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand_shapes/properties/secondary_shapes","kind":"array","property":"secondary_shapes","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/brand_shapes/properties/secondary_shapes/items","kind":"string","property":"secondary_shapes","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/iconography/properties/stroke_weight","kind":"string","property":"stroke_weight","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/iconography/properties/usage/properties/size_ratio","kind":"string","property":"size_ratio","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/composition_rules/properties/overlays/properties/gradient_direction","kind":"string","property":"gradient_direction","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/composition_rules/properties/overlays/properties/opacity","kind":"string","property":"opacity","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/composition_rules/properties/backgrounds/properties/types_allowed","kind":"array","property":"types_allowed","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/colorway/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/colorway/properties/channels","kind":"array","property":"channels","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/colorway/properties/channels/items","kind":"string","property":"channels","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/color_constraint/properties/applies_to","kind":"array","property":"applies_to","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (9 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/color_constraint/properties/allowed_on","kind":"array","property":"allowed_on","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/color_ref","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/color_constraint/properties/forbidden_on","kind":"array","property":"forbidden_on","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/color_ref","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/color_constraint/properties/never_pair_with","kind":"array","property":"never_pair_with","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/color_ref","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/color_constraint/properties/contexts","kind":"array","property":"contexts","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/color_constraint/properties/contexts/items","kind":"string","property":"contexts","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/color_constraint/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/logo_usage_rule/properties/logo_tags","kind":"array","property":"logo_tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/logo_usage_rule/properties/logo_tags/items","kind":"string","property":"logo_tags","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/logo_usage_rule/properties/contexts","kind":"array","property":"contexts","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/logo_usage_rule/properties/contexts/items","kind":"string","property":"contexts","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/logo_usage_rule/properties/slots","kind":"array","property":"slots","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/logo_slot","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (13 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/logo_usage_rule/properties/minimum_size/properties/width","kind":"string","property":"width","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/logo_usage_rule/properties/minimum_size/properties/height","kind":"string","property":"height","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/logo_usage_rule/properties/clear_space","kind":"string","property":"clear_space","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/logo_usage_rule/properties/allowed_backgrounds","kind":"array","property":"allowed_backgrounds","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/color_ref","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/logo_usage_rule/properties/forbidden_backgrounds","kind":"array","property":"forbidden_backgrounds","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/color_ref","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/logo_usage_rule/properties/forbidden_contexts","kind":"array","property":"forbidden_contexts","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/logo_usage_rule/properties/forbidden_contexts/items","kind":"string","property":"forbidden_contexts","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/logo_usage_rule/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/mark_lockup/properties/contexts","kind":"array","property":"contexts","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/mark_lockup/properties/contexts/items","kind":"string","property":"contexts","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/mark_lockup/properties/secondary_logo_ids","kind":"array","property":"secondary_logo_ids","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/logo_id","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/mark_lockup/properties/separator/properties/width","kind":"string","property":"width","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/mark_lockup/properties/min_gap","kind":"string","property":"min_gap","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/mark_lockup/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/type_scale_entry/properties/font","kind":"string","property":"font","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/type_scale_entry/properties/size","kind":"string","property":"size","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/type_scale_entry/properties/weight","kind":"string","property":"weight","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/type_scale_entry/properties/line_height","kind":"string","property":"line_height","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/type_scale_entry/properties/letter_spacing","kind":"string","property":"letter_spacing","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/motion_guidelines/properties/easing","kind":"string","property":"easing","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/motion_guidelines/properties/tags","kind":"array","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/motion_guidelines/properties/tags/items","kind":"string","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/logo_placement/properties/min_clear_space","kind":"string","property":"min_clear_space","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/logo_placement/properties/min_height","kind":"string","property":"min_height","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/graphic_element/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/graphic_element/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/graphic_element/properties/colors","kind":"array","property":"colors","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/hex_color","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/asset_library/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/asset_library/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/asset_library/properties/color_guide/properties/roles","kind":"array","property":"roles","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/asset_library/properties/color_guide/properties/roles/items","kind":"string","property":"roles","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/asset_library/properties/color_guide/properties/palettes","kind":"array","property":"palettes","side":"other","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/asset_library/properties/color_guide/properties/palettes/items/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/visual_guidelines/properties/graphic_elements","kind":"array","property":"graphic_elements","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/graphic_element","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/visual_guidelines/properties/colorways","kind":"array","property":"colorways","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/colorway","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/visual_guidelines/properties/color_constraints","kind":"array","property":"color_constraints","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/color_constraint","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/visual_guidelines/properties/logo_usage_rules","kind":"array","property":"logo_usage_rules","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/logo_usage_rule","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/visual_guidelines/properties/mark_lockups","kind":"array","property":"mark_lockups","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/mark_lockup","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/visual_guidelines/properties/type_scale/properties/base_width","kind":"string","property":"base_width","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/visual_guidelines/properties/asset_libraries","kind":"array","property":"asset_libraries","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/asset_library","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/visual_guidelines/properties/restrictions","kind":"array","property":"restrictions","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand.json","pointer":"/definitions/visual_guidelines/properties/restrictions/items","kind":"string","property":"restrictions","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand/creative-approval-request.json","pointer":"/properties/rights_id","kind":"string","property":"rights_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand/creative-approval-request.json","pointer":"/properties/creative_id","kind":"string","property":"creative_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand/creative-approval-request.json","pointer":"/properties/description","kind":"string","property":"description","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"brand/creative-approval-response.json","pointer":"/oneOf/0/properties/rights_id","kind":"string","property":"rights_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand/creative-approval-response.json","pointer":"/oneOf/0/properties/creative_id","kind":"string","property":"creative_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand/creative-approval-response.json","pointer":"/oneOf/0/properties/conditions","kind":"array","property":"conditions","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand/creative-approval-response.json","pointer":"/oneOf/0/properties/conditions/items","kind":"string","property":"conditions","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"brand/creative-approval-response.json","pointer":"/oneOf/1/properties/rights_id","kind":"string","property":"rights_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand/creative-approval-response.json","pointer":"/oneOf/1/properties/creative_id","kind":"string","property":"creative_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand/creative-approval-response.json","pointer":"/oneOf/1/properties/reason","kind":"string","property":"reason","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"brand/creative-approval-response.json","pointer":"/oneOf/1/properties/suggestions","kind":"array","property":"suggestions","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand/creative-approval-response.json","pointer":"/oneOf/1/properties/suggestions/items","kind":"string","property":"suggestions","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"brand/creative-approval-response.json","pointer":"/oneOf/2/properties/rights_id","kind":"string","property":"rights_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand/creative-approval-response.json","pointer":"/oneOf/2/properties/creative_id","kind":"string","property":"creative_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand/creative-approval-response.json","pointer":"/oneOf/2/properties/estimated_response_time","kind":"string","property":"estimated_response_time","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand/creative-approval-response.json","pointer":"/oneOf/3/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-request.json","pointer":"/properties/brand_id","kind":"string","property":"brand_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-request.json","pointer":"/properties/fields","kind":"array","property":"fields","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (13 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-request.json","pointer":"/properties/use_case","kind":"string","property":"use_case","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/brand_id","kind":"string","property":"brand_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/house/properties/domain","kind":"string","property":"domain","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/house/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/names","kind":"array","property":"names","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/names/items/additionalProperties","kind":"string","property":"names","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/description","kind":"string","property":"description","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/industries","kind":"array","property":"industries","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/industries/items","kind":"string","property":"industries","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/logos","kind":"array","property":"logos","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/logos/items/properties/tags","kind":"array","property":"tags","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/logos/items/properties/tags/items","kind":"string","property":"tags","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/logos/items/properties/usage","kind":"string","property":"usage","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/colors/properties/primary/oneOf/1","kind":"array","property":"primary","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/colors/properties/secondary/oneOf/1","kind":"array","property":"secondary","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/colors/properties/accent/oneOf/1","kind":"array","property":"accent","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/colors/properties/background/oneOf/1","kind":"array","property":"background","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/colors/properties/text/oneOf/1","kind":"array","property":"text","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/fonts/definitions/font_role/oneOf/0","kind":"string","property":"font_role","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/fonts/definitions/font_role/oneOf/1/properties/family","kind":"string","property":"family","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/tone/properties/voice","kind":"string","property":"voice","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/tone/properties/attributes","kind":"array","property":"attributes","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/tone/properties/attributes/items","kind":"string","property":"attributes","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/tone/properties/dos","kind":"array","property":"dos","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/tone/properties/dos/items","kind":"string","property":"dos","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/tone/properties/donts","kind":"array","property":"donts","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/tone/properties/donts/items","kind":"string","property":"donts","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/tagline/oneOf/0","kind":"string","property":"tagline","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"One-line marketing text.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/tagline/oneOf/1","kind":"array","property":"tagline","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/tagline/oneOf/1/items/additionalProperties","kind":"string","property":"tagline","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"One-line marketing text.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/voice_synthesis/properties/provider","kind":"string","property":"provider","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/voice_synthesis/properties/voice_id","kind":"string","property":"voice_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/voice_synthesis/properties/rights_offering_id","kind":"string","property":"rights_offering_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/assets","kind":"array","property":"assets","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/assets/items/properties/asset_id","kind":"string","property":"asset_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/assets/items/properties/tags","kind":"array","property":"tags","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/assets/items/properties/tags/items","kind":"string","property":"tags","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/assets/items/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/assets/items/properties/description","kind":"string","property":"description","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/assets/items/properties/format","kind":"string","property":"format","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/rights/properties/available_uses","kind":"array","property":"available_uses","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/right-use.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (12 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/rights/properties/countries","kind":"array","property":"countries","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/rights/properties/excluded_countries","kind":"array","property":"excluded_countries","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/rights/properties/exclusivity_model","kind":"string","property":"exclusivity_model","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/rights/properties/content_restrictions","kind":"array","property":"content_restrictions","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/rights/properties/content_restrictions/items","kind":"string","property":"content_restrictions","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/collections","kind":"array","property":"collections","side":"response","stability":"experimental","added_in_3_3":true,"in_last_stable":"unknown","items":"object","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/0/properties/available_fields","kind":"array","property":"available_fields","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (13 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"brand/get-brand-identity-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"brand/revocation-notification.json","pointer":"/properties/rights_id","kind":"string","property":"rights_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand/revocation-notification.json","pointer":"/properties/brand_id","kind":"string","property":"brand_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand/revocation-notification.json","pointer":"/properties/reason","kind":"string","property":"reason","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"brand/revocation-notification.json","pointer":"/properties/revoked_uses","kind":"array","property":"revoked_uses","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/right-use.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (12 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"brand/update-rights-response.json","pointer":"/oneOf/0/properties/generation_credentials","kind":"array","property":"generation_credentials","side":"response","stability":"experimental","in_last_stable":"yes","items":"$ref /schemas/core/generation-credential.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"deferred (SDK generation)"}, + {"file":"brand/verify-brand-claim-request.json","pointer":"/oneOf/0/properties/claim/properties/subsidiary_domain","kind":"string","property":"subsidiary_domain","side":"request","stability":"stable","in_last_stable":"yes","format":"hostname","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"brand/verify-brand-claim-request.json","pointer":"/oneOf/0/properties/claim/properties/subsidiary_brand_id","kind":"string","property":"subsidiary_brand_id","side":"request","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9_]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand/verify-brand-claim-request.json","pointer":"/oneOf/1/properties/claim/properties/parent_domain","kind":"string","property":"parent_domain","side":"request","stability":"stable","in_last_stable":"yes","format":"hostname","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"brand/verify-brand-claim-request.json","pointer":"/oneOf/1/properties/claim/properties/claimant_says","kind":"string","property":"claimant_says","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand/verify-brand-claim-request.json","pointer":"/oneOf/2/properties/claim/properties/property/properties/identifier","kind":"string","property":"identifier","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand/verify-brand-claim-request.json","pointer":"/oneOf/2/properties/claim/properties/property/properties/region","kind":"string","property":"region","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"brand/verify-brand-claim-request.json","pointer":"/oneOf/3/properties/claim/properties/countries","kind":"array","property":"countries","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"brand/verify-brand-claim-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"brand/verify-brand-claims-request.json","pointer":"/definitions/claim_entry/oneOf/0/properties/claim/properties/subsidiary_domain","kind":"string","property":"subsidiary_domain","side":"request","stability":"stable","in_last_stable":"yes","format":"hostname","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"brand/verify-brand-claims-request.json","pointer":"/definitions/claim_entry/oneOf/0/properties/claim/properties/subsidiary_brand_id","kind":"string","property":"subsidiary_brand_id","side":"request","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9_]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand/verify-brand-claims-request.json","pointer":"/definitions/claim_entry/oneOf/1/properties/claim/properties/parent_domain","kind":"string","property":"parent_domain","side":"request","stability":"stable","in_last_stable":"yes","format":"hostname","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"brand/verify-brand-claims-request.json","pointer":"/definitions/claim_entry/oneOf/1/properties/claim/properties/claimant_says","kind":"string","property":"claimant_says","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"brand/verify-brand-claims-request.json","pointer":"/definitions/claim_entry/oneOf/2/properties/claim/properties/property/properties/identifier","kind":"string","property":"identifier","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"brand/verify-brand-claims-request.json","pointer":"/definitions/claim_entry/oneOf/2/properties/claim/properties/property/properties/region","kind":"string","property":"region","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"brand/verify-brand-claims-request.json","pointer":"/definitions/claim_entry/oneOf/3/properties/claim/properties/countries","kind":"array","property":"countries","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"brand/verify-brand-claims-response.json","pointer":"/oneOf/0/properties/results","kind":"array","property":"results","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/result_entry","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"brand/verify-brand-claims-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"brand/verify-brand-claims-response.json","pointer":"/definitions/signed_success_payload/properties/results","kind":"array","property":"results","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/result_entry","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"collection/base-collection-source.json","pointer":"/oneOf/0/properties/identifiers","kind":"array","property":"identifiers","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"collection/base-collection-source.json","pointer":"/oneOf/0/properties/identifiers/items/properties/value","kind":"string","property":"value","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"collection/base-collection-source.json","pointer":"/oneOf/1/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"collection/base-collection-source.json","pointer":"/oneOf/1/properties/collection_ids","kind":"array","property":"collection_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"collection/base-collection-source.json","pointer":"/oneOf/1/properties/collection_ids/items","kind":"string","property":"collection_ids","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"collection/base-collection-source.json","pointer":"/oneOf/2/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"collection/base-collection-source.json","pointer":"/oneOf/2/properties/genres","kind":"array","property":"genres","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"collection/base-collection-source.json","pointer":"/oneOf/2/properties/genres/items","kind":"string","property":"genres","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"collection/collection-list-changed-webhook.json","pointer":"/properties/list_id","kind":"string","property":"list_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"collection/collection-list-changed-webhook.json","pointer":"/properties/list_name","kind":"string","property":"list_name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"collection/collection-list-changed-webhook.json","pointer":"/properties/signature","kind":"string","property":"signature","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"collection/collection-list-filters.json","pointer":"/properties/content_ratings_exclude","kind":"array","property":"content_ratings_exclude","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/content-rating.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"collection/collection-list-filters.json","pointer":"/properties/content_ratings_include","kind":"array","property":"content_ratings_include","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/content-rating.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"collection/collection-list-filters.json","pointer":"/properties/genres_exclude","kind":"array","property":"genres_exclude","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"collection/collection-list-filters.json","pointer":"/properties/genres_exclude/items","kind":"string","property":"genres_exclude","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"collection/collection-list-filters.json","pointer":"/properties/genres_include","kind":"array","property":"genres_include","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"collection/collection-list-filters.json","pointer":"/properties/genres_include/items","kind":"string","property":"genres_include","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"collection/collection-list-filters.json","pointer":"/properties/kinds","kind":"array","property":"kinds","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/collection-kind.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"collection/collection-list-filters.json","pointer":"/properties/exclude_distribution_ids","kind":"array","property":"exclude_distribution_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"collection/collection-list-filters.json","pointer":"/properties/exclude_distribution_ids/items/properties/value","kind":"string","property":"value","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"collection/collection-list-filters.json","pointer":"/properties/production_quality","kind":"array","property":"production_quality","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/production-quality.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"collection/collection-list.json","pointer":"/properties/list_id","kind":"string","property":"list_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"collection/collection-list.json","pointer":"/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"collection/collection-list.json","pointer":"/properties/description","kind":"string","property":"description","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"collection/collection-list.json","pointer":"/properties/base_collections","kind":"array","property":"base_collections","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/collection/base-collection-source.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"collection/create-collection-list-request.json","pointer":"/properties/name","kind":"string","property":"name","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"collection/create-collection-list-request.json","pointer":"/properties/description","kind":"string","property":"description","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"collection/create-collection-list-request.json","pointer":"/properties/base_collections","kind":"array","property":"base_collections","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/collection/base-collection-source.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"collection/create-collection-list-response.json","pointer":"/properties/auth_token","kind":"string","property":"auth_token","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"collection/delete-collection-list-request.json","pointer":"/properties/list_id","kind":"string","property":"list_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"collection/delete-collection-list-response.json","pointer":"/properties/list_id","kind":"string","property":"list_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"collection/get-collection-list-request.json","pointer":"/properties/list_id","kind":"string","property":"list_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"collection/get-collection-list-request.json","pointer":"/properties/pagination/properties/cursor","kind":"string","property":"cursor","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"collection/get-collection-list-response.json","pointer":"/properties/collections","kind":"array","property":"collections","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"collection/get-collection-list-response.json","pointer":"/properties/collections/items/properties/collection_rid","kind":"string","property":"collection_rid","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"collection/get-collection-list-response.json","pointer":"/properties/collections/items/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"collection/get-collection-list-response.json","pointer":"/properties/collections/items/properties/collection_id","kind":"string","property":"collection_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"collection/get-collection-list-response.json","pointer":"/properties/collections/items/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"collection/get-collection-list-response.json","pointer":"/properties/collections/items/properties/distribution_ids","kind":"array","property":"distribution_ids","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"collection/get-collection-list-response.json","pointer":"/properties/collections/items/properties/distribution_ids/items/properties/value","kind":"string","property":"value","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"collection/get-collection-list-response.json","pointer":"/properties/collections/items/properties/genre","kind":"array","property":"genre","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"collection/get-collection-list-response.json","pointer":"/properties/collections/items/properties/genre/items","kind":"string","property":"genre","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"collection/get-collection-list-response.json","pointer":"/properties/coverage_gaps/additionalProperties","kind":"array","property":"coverage_gaps","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"collection/get-collection-list-response.json","pointer":"/properties/coverage_gaps/additionalProperties/items/properties/value","kind":"string","property":"value","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"collection/list-collection-lists-request.json","pointer":"/properties/name_contains","kind":"string","property":"name_contains","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"collection/list-collection-lists-response.json","pointer":"/properties/lists","kind":"array","property":"lists","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/collection/collection-list.json","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"collection/update-collection-list-request.json","pointer":"/properties/list_id","kind":"string","property":"list_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"collection/update-collection-list-request.json","pointer":"/properties/name","kind":"string","property":"name","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"collection/update-collection-list-request.json","pointer":"/properties/description","kind":"string","property":"description","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"collection/update-collection-list-request.json","pointer":"/properties/base_collections","kind":"array","property":"base_collections","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/collection/base-collection-source.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/allOf/26/then/properties/params/properties/endpoint_pattern","kind":"string","property":"endpoint_pattern","side":"request","stability":"stable","in_last_stable":"unknown","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/scenario","kind":"string","property":"scenario","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/creative_id","kind":"string","property":"creative_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/account_id","kind":"string","property":"account_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/session_id","kind":"string","property":"session_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/product_id","kind":"string","property":"product_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/proposal_id","kind":"string","property":"proposal_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/plan_id","kind":"string","property":"plan_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/rights_id","kind":"string","property":"rights_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/status","kind":"string","property":"status","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/rejection_reason","kind":"string","property":"rejection_reason","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/reason_detail","kind":"string","property":"reason_detail","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/termination_reason","kind":"string","property":"termination_reason","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/property_delivery","kind":"array","property":"property_delivery","side":"request","stability":"stable","in_last_stable":"no","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/property_delivery/items/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"request","stability":"stable","in_last_stable":"no","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/installment_property_delivery","kind":"array","property":"installment_property_delivery","side":"request","stability":"stable","in_last_stable":"no","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/installment_property_delivery/items/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"request","stability":"stable","in_last_stable":"no","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/vendor_metric_values","kind":"array","property":"vendor_metric_values","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/vendor-metric-value.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/vendor_metric_values_by_package/additionalProperties","kind":"array","property":"vendor_metric_values_by_package","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/vendor-metric-value.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/not_yet_measurable_vendor_metrics","kind":"array","property":"not_yet_measurable_vendor_metrics","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/not_yet_measurable_vendor_metrics_by_package/additionalProperties","kind":"array","property":"not_yet_measurable_vendor_metrics_by_package","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/format_id","kind":"string","property":"format_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/metrics","kind":"array","property":"metrics","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/tool","kind":"string","property":"tool","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-request.json","pointer":"/properties/params/properties/upstream_name","kind":"string","property":"upstream_name","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-response.json","pointer":"/oneOf/0/properties/scenarios","kind":"array","property":"scenarios","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-response.json","pointer":"/oneOf/0/properties/scenarios/items","kind":"string","property":"scenarios","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-response.json","pointer":"/oneOf/1/properties/previous_state","kind":"string","property":"previous_state","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-response.json","pointer":"/oneOf/1/properties/current_state","kind":"string","property":"current_state","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-response.json","pointer":"/oneOf/3/properties/forced/properties/proposal_id","kind":"string","property":"proposal_id","side":"response","stability":"experimental","added_in_3_3":true,"in_last_stable":"unknown","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"withdrawn (#8501)"}, + {"file":"compliance/comply-test-controller-response.json","pointer":"/oneOf/5/properties/creative_id","kind":"string","property":"creative_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-response.json","pointer":"/oneOf/5/properties/audit_observations","kind":"array","property":"audit_observations","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/creative/audit-observation.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-response.json","pointer":"/oneOf/6/properties/recorded_calls","kind":"array","property":"recorded_calls","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-response.json","pointer":"/oneOf/6/properties/recorded_calls/items/properties/endpoint","kind":"string","property":"endpoint","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2048,"tier":"string-url","rationale":"URL-shaped value; 2,048 is the repository default and the common browser limit.","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-response.json","pointer":"/oneOf/6/properties/recorded_calls/items/properties/host","kind":"string","property":"host","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-response.json","pointer":"/oneOf/6/properties/recorded_calls/items/properties/path","kind":"string","property":"path","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-response.json","pointer":"/oneOf/6/properties/recorded_calls/items/properties/content_type","kind":"string","property":"content_type","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-response.json","pointer":"/oneOf/7/properties/error_detail","kind":"string","property":"error_detail","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"compliance/comply-test-controller-response.json","pointer":"/oneOf/7/properties/current_state","kind":"string","property":"current_state","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"compliance/get-creative-features-completion.json","pointer":"/properties/evaluation_id","kind":"string","property":"evaluation_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"compliance/get-creative-features-completion.json","pointer":"/properties/results","kind":"array","property":"results","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/creative/creative-feature-result.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"compliance/get-creative-features-completion.json","pointer":"/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/artifact-webhook-payload.json","pointer":"/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/artifact-webhook-payload.json","pointer":"/properties/batch_id","kind":"string","property":"batch_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/artifact-webhook-payload.json","pointer":"/properties/artifacts","kind":"array","property":"artifacts","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"content-standards/artifact-webhook-payload.json","pointer":"/properties/artifacts/items/properties/impression_id","kind":"string","property":"impression_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/artifact-webhook-payload.json","pointer":"/properties/artifacts/items/properties/package_id","kind":"string","property":"package_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/artifact.json","pointer":"/properties/property_rid","kind":"string","property":"property_rid","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/artifact.json","pointer":"/properties/artifact_id","kind":"string","property":"artifact_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/artifact.json","pointer":"/properties/variant_id","kind":"string","property":"variant_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/artifact.json","pointer":"/properties/assets/items/oneOf/0/properties/language","kind":"string","property":"language","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"content-standards/artifact.json","pointer":"/properties/assets/items/oneOf/1/properties/alt_text","kind":"string","property":"alt_text","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/artifact.json","pointer":"/properties/assets/items/oneOf/1/properties/caption","kind":"string","property":"caption","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/artifact.json","pointer":"/properties/metadata/properties/author","kind":"string","property":"author","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"content-standards/artifact.json","pointer":"/properties/metadata/properties/keywords","kind":"string","property":"keywords","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"content-standards/artifact.json","pointer":"/properties/metadata/properties/json_ld","kind":"array","property":"json_ld","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"content-standards/artifact.json","pointer":"/properties/identifiers/properties/apple_podcast_id","kind":"string","property":"apple_podcast_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/artifact.json","pointer":"/properties/identifiers/properties/spotify_collection_id","kind":"string","property":"spotify_collection_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/artifact.json","pointer":"/properties/identifiers/properties/podcast_guid","kind":"string","property":"podcast_guid","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"content-standards/artifact.json","pointer":"/properties/identifiers/properties/youtube_video_id","kind":"string","property":"youtube_video_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/artifact.json","pointer":"/$defs/asset_access/oneOf/0/properties/token","kind":"string","property":"token","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"content-standards/calibrate-content-request.json","pointer":"/properties/standards_id","kind":"string","property":"standards_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/calibrate-content-response.json","pointer":"/oneOf/0/properties/explanation","kind":"string","property":"explanation","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/calibrate-content-response.json","pointer":"/oneOf/0/properties/features","kind":"array","property":"features","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"content-standards/calibrate-content-response.json","pointer":"/oneOf/0/properties/features/items/properties/feature_id","kind":"string","property":"feature_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/calibrate-content-response.json","pointer":"/oneOf/0/properties/features/items/properties/policy_id","kind":"string","property":"policy_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/calibrate-content-response.json","pointer":"/oneOf/0/properties/features/items/properties/explanation","kind":"string","property":"explanation","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/calibrate-content-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"content-standards/content-standards.json","pointer":"/properties/standards_id","kind":"string","property":"standards_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/content-standards.json","pointer":"/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/content-standards.json","pointer":"/properties/countries_all","kind":"array","property":"countries_all","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"content-standards/content-standards.json","pointer":"/properties/countries_all/items","kind":"string","property":"countries_all","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"content-standards/content-standards.json","pointer":"/properties/channels_any","kind":"array","property":"channels_any","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/channels.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (20 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"content-standards/content-standards.json","pointer":"/properties/languages_any","kind":"array","property":"languages_any","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"content-standards/content-standards.json","pointer":"/properties/languages_any/items","kind":"string","property":"languages_any","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"content-standards/content-standards.json","pointer":"/properties/policies","kind":"array","property":"policies","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/governance/policy-entry.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"content-standards/content-standards.json","pointer":"/properties/calibration_exemplars/properties/pass","kind":"array","property":"pass","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/content-standards/artifact.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"content-standards/content-standards.json","pointer":"/properties/calibration_exemplars/properties/fail","kind":"array","property":"fail","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/content-standards/artifact.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"content-standards/content-standards.json","pointer":"/properties/pricing_options","kind":"array","property":"pricing_options","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/vendor-pricing-option.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"content-standards/create-content-standards-request.json","pointer":"/properties/scope/properties/countries_all","kind":"array","property":"countries_all","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"content-standards/create-content-standards-request.json","pointer":"/properties/scope/properties/countries_all/items","kind":"string","property":"countries_all","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"content-standards/create-content-standards-request.json","pointer":"/properties/scope/properties/channels_any","kind":"array","property":"channels_any","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/channels.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (20 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"content-standards/create-content-standards-request.json","pointer":"/properties/scope/properties/languages_any","kind":"array","property":"languages_any","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"content-standards/create-content-standards-request.json","pointer":"/properties/scope/properties/languages_any/items","kind":"string","property":"languages_any","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"content-standards/create-content-standards-request.json","pointer":"/properties/scope/properties/description","kind":"string","property":"description","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/create-content-standards-request.json","pointer":"/properties/registry_policy_ids","kind":"array","property":"registry_policy_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"content-standards/create-content-standards-request.json","pointer":"/properties/registry_policy_ids/items","kind":"string","property":"registry_policy_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/create-content-standards-request.json","pointer":"/properties/policies","kind":"array","property":"policies","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/governance/policy-entry.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"content-standards/create-content-standards-request.json","pointer":"/properties/calibration_exemplars/properties/pass","kind":"array","property":"pass","side":"request","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"content-standards/create-content-standards-request.json","pointer":"/properties/calibration_exemplars/properties/pass/items/oneOf/0/properties/language","kind":"string","property":"language","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"content-standards/create-content-standards-request.json","pointer":"/properties/calibration_exemplars/properties/fail","kind":"array","property":"fail","side":"request","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"content-standards/create-content-standards-request.json","pointer":"/properties/calibration_exemplars/properties/fail/items/oneOf/0/properties/language","kind":"string","property":"language","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"content-standards/create-content-standards-response.json","pointer":"/oneOf/0/properties/standards_id","kind":"string","property":"standards_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/create-content-standards-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"content-standards/create-content-standards-response.json","pointer":"/oneOf/1/properties/conflicting_standards_id","kind":"string","property":"conflicting_standards_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/get-content-standards-request.json","pointer":"/properties/standards_id","kind":"string","property":"standards_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/get-content-standards-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"content-standards/get-media-buy-artifacts-request.json","pointer":"/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/get-media-buy-artifacts-request.json","pointer":"/properties/package_ids","kind":"array","property":"package_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"content-standards/get-media-buy-artifacts-request.json","pointer":"/properties/package_ids/items","kind":"string","property":"package_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/get-media-buy-artifacts-request.json","pointer":"/properties/pagination/properties/cursor","kind":"string","property":"cursor","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"content-standards/get-media-buy-artifacts-response.json","pointer":"/oneOf/0/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/get-media-buy-artifacts-response.json","pointer":"/oneOf/0/properties/artifacts","kind":"array","property":"artifacts","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"content-standards/get-media-buy-artifacts-response.json","pointer":"/oneOf/0/properties/artifacts/items/properties/record_id","kind":"string","property":"record_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/get-media-buy-artifacts-response.json","pointer":"/oneOf/0/properties/artifacts/items/properties/package_id","kind":"string","property":"package_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/get-media-buy-artifacts-response.json","pointer":"/oneOf/0/properties/artifacts/items/properties/country","kind":"string","property":"country","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"content-standards/get-media-buy-artifacts-response.json","pointer":"/oneOf/0/properties/artifacts/items/properties/channel","kind":"string","property":"channel","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"content-standards/get-media-buy-artifacts-response.json","pointer":"/oneOf/0/properties/artifacts/items/properties/brand_context/properties/brand_id","kind":"string","property":"brand_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/get-media-buy-artifacts-response.json","pointer":"/oneOf/0/properties/artifacts/items/properties/brand_context/properties/sku_id","kind":"string","property":"sku_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/get-media-buy-artifacts-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"content-standards/list-content-standards-request.json","pointer":"/properties/channels","kind":"array","property":"channels","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/channels.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (20 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"content-standards/list-content-standards-request.json","pointer":"/properties/languages","kind":"array","property":"languages","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 639 / BCP 47 language codes (184 two-letter languages): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"content-standards/list-content-standards-request.json","pointer":"/properties/languages/items","kind":"string","property":"languages","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"content-standards/list-content-standards-request.json","pointer":"/properties/countries","kind":"array","property":"countries","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"content-standards/list-content-standards-request.json","pointer":"/properties/countries/items","kind":"string","property":"countries","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"content-standards/list-content-standards-response.json","pointer":"/oneOf/0/properties/standards","kind":"array","property":"standards","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/content-standards/content-standards.json","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"content-standards/list-content-standards-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"content-standards/update-content-standards-request.json","pointer":"/properties/standards_id","kind":"string","property":"standards_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/update-content-standards-request.json","pointer":"/properties/scope/properties/countries_all","kind":"array","property":"countries_all","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"content-standards/update-content-standards-request.json","pointer":"/properties/scope/properties/countries_all/items","kind":"string","property":"countries_all","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"content-standards/update-content-standards-request.json","pointer":"/properties/scope/properties/channels_any","kind":"array","property":"channels_any","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/channels.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (20 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"content-standards/update-content-standards-request.json","pointer":"/properties/scope/properties/languages_any","kind":"array","property":"languages_any","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"content-standards/update-content-standards-request.json","pointer":"/properties/scope/properties/languages_any/items","kind":"string","property":"languages_any","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"content-standards/update-content-standards-request.json","pointer":"/properties/scope/properties/description","kind":"string","property":"description","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/update-content-standards-request.json","pointer":"/properties/registry_policy_ids","kind":"array","property":"registry_policy_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"content-standards/update-content-standards-request.json","pointer":"/properties/registry_policy_ids/items","kind":"string","property":"registry_policy_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/update-content-standards-request.json","pointer":"/properties/policies","kind":"array","property":"policies","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/governance/policy-entry.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"content-standards/update-content-standards-request.json","pointer":"/properties/calibration_exemplars/properties/pass","kind":"array","property":"pass","side":"request","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"content-standards/update-content-standards-request.json","pointer":"/properties/calibration_exemplars/properties/pass/items/oneOf/0/properties/language","kind":"string","property":"language","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"content-standards/update-content-standards-request.json","pointer":"/properties/calibration_exemplars/properties/fail","kind":"array","property":"fail","side":"request","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"content-standards/update-content-standards-request.json","pointer":"/properties/calibration_exemplars/properties/fail/items/oneOf/0/properties/language","kind":"string","property":"language","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"content-standards/update-content-standards-response.json","pointer":"/oneOf/0/properties/standards_id","kind":"string","property":"standards_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/update-content-standards-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"content-standards/update-content-standards-response.json","pointer":"/oneOf/1/properties/conflicting_standards_id","kind":"string","property":"conflicting_standards_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/validate-content-delivery-request.json","pointer":"/properties/standards_id","kind":"string","property":"standards_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/validate-content-delivery-request.json","pointer":"/properties/records/items/properties/record_id","kind":"string","property":"record_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/validate-content-delivery-request.json","pointer":"/properties/records/items/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/validate-content-delivery-request.json","pointer":"/properties/records/items/properties/country","kind":"string","property":"country","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"content-standards/validate-content-delivery-request.json","pointer":"/properties/records/items/properties/channel","kind":"string","property":"channel","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"content-standards/validate-content-delivery-request.json","pointer":"/properties/records/items/properties/brand_context/properties/brand_id","kind":"string","property":"brand_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/validate-content-delivery-request.json","pointer":"/properties/records/items/properties/brand_context/properties/sku_id","kind":"string","property":"sku_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/validate-content-delivery-request.json","pointer":"/properties/feature_ids","kind":"array","property":"feature_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"content-standards/validate-content-delivery-request.json","pointer":"/properties/feature_ids/items","kind":"string","property":"feature_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/validate-content-delivery-response.json","pointer":"/oneOf/0/properties/results","kind":"array","property":"results","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"content-standards/validate-content-delivery-response.json","pointer":"/oneOf/0/properties/results/items/properties/record_id","kind":"string","property":"record_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/validate-content-delivery-response.json","pointer":"/oneOf/0/properties/results/items/properties/features","kind":"array","property":"features","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"content-standards/validate-content-delivery-response.json","pointer":"/oneOf/0/properties/results/items/properties/features/items/properties/feature_id","kind":"string","property":"feature_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/validate-content-delivery-response.json","pointer":"/oneOf/0/properties/results/items/properties/features/items/properties/policy_id","kind":"string","property":"policy_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/validate-content-delivery-response.json","pointer":"/oneOf/0/properties/results/items/properties/features/items/properties/explanation","kind":"string","property":"explanation","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"content-standards/validate-content-delivery-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"core/acceptance-policy-profile-ids.json","pointer":"","kind":"array","property":"","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/acceptance-policy-profile-ids.json","pointer":"/items","kind":"string","property":"","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/account-authorization.json","pointer":"/properties/allowed_tasks","kind":"array","property":"allowed_tasks","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/account-authorization.json","pointer":"/properties/allowed_tasks/items","kind":"string","property":"allowed_tasks","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/account-authorization.json","pointer":"/properties/field_scopes/additionalProperties","kind":"array","property":"field_scopes","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/account-authorization.json","pointer":"/properties/field_scopes/additionalProperties/items","kind":"string","property":"field_scopes","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/account-authorization.json","pointer":"/properties/scope_name/anyOf/1","kind":"string","property":"scope_name","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^custom:[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/account-change.json","pointer":"/properties/resource_revision","kind":"string","property":"resource_revision","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/account-identity-change-preview.json","pointer":"/oneOf/2/properties/blockers","kind":"array","property":"blockers","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/account-ref.json","pointer":"/oneOf/0/properties/account_id","kind":"string","property":"account_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/account-ref.json","pointer":"/oneOf/1/properties/operator","kind":"string","property":"operator","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/account-ref.json","pointer":"/oneOf/1/properties/timezone","kind":"string","property":"timezone","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/account-status-changed-webhook.json","pointer":"/properties/account_id","kind":"string","property":"account_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/account-status-changed-webhook.json","pointer":"/properties/setup/properties/message","kind":"string","property":"message","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/account-timezone-capability.json","pointer":"/properties/fixed_timezone","kind":"string","property":"fixed_timezone","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"core/account-timezone-capability.json","pointer":"/properties/supported_timezones","kind":"array","property":"supported_timezones","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/account-timezone-capability.json","pointer":"/properties/supported_timezones/items","kind":"string","property":"supported_timezones","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/account.json","pointer":"/properties/account_id","kind":"string","property":"account_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/account.json","pointer":"/properties/name","kind":"string","property":"name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/account.json","pointer":"/properties/advertiser","kind":"string","property":"advertiser","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/account.json","pointer":"/properties/billing_proxy","kind":"string","property":"billing_proxy","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/account.json","pointer":"/properties/operator","kind":"string","property":"operator","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/account.json","pointer":"/properties/timezone","kind":"string","property":"timezone","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"core/account.json","pointer":"/properties/rate_card","kind":"string","property":"rate_card","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/account.json","pointer":"/properties/setup/properties/message","kind":"string","property":"message","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/activation-key.json","pointer":"/oneOf/0/properties/segment_id","kind":"string","property":"segment_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/activation-key.json","pointer":"/oneOf/1/properties/key","kind":"string","property":"key","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/activation-key.json","pointer":"/oneOf/1/properties/value","kind":"string","property":"value","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"core/ad-inventory-config.json","pointer":"/properties/supported_formats","kind":"array","property":"supported_formats","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/ad-inventory-config.json","pointer":"/properties/supported_formats/items","kind":"string","property":"supported_formats","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/agent-encryption-key.json","pointer":"/properties/x","kind":"string","property":"x","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/agent-notification-config-state.json","pointer":"/properties/event_types","kind":"array","property":"event_types","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/agent-notification-config.json","pointer":"/properties/event_types","kind":"array","property":"event_types","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/agent-notification-config.json","pointer":"/properties/authentication/properties/credentials","kind":"string","property":"credentials","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"core/agent-signing-key.json","pointer":"/properties/kid","kind":"string","property":"kid","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/agent-signing-key.json","pointer":"/properties/kty","kind":"string","property":"kty","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/agent-signing-key.json","pointer":"/properties/alg","kind":"string","property":"alg","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/agent-signing-key.json","pointer":"/properties/use","kind":"string","property":"use","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/agent-signing-key.json","pointer":"/properties/crv","kind":"string","property":"crv","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/agent-signing-key.json","pointer":"/properties/x","kind":"string","property":"x","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/agent-signing-key.json","pointer":"/properties/y","kind":"string","property":"y","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/agent-signing-key.json","pointer":"/properties/n","kind":"string","property":"n","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/agent-signing-key.json","pointer":"/properties/e","kind":"string","property":"e","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/agent-webhook-challenge.json","pointer":"/properties/event_types","kind":"array","property":"event_types","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (1 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/app-item.json","pointer":"/properties/app_id","kind":"string","property":"app_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/app-item.json","pointer":"/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/app-item.json","pointer":"/properties/bundle_id","kind":"string","property":"bundle_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/app-item.json","pointer":"/properties/apple_id","kind":"string","property":"apple_id","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[0-9]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/app-item.json","pointer":"/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/app-item.json","pointer":"/properties/category","kind":"string","property":"category","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/app-item.json","pointer":"/properties/genre","kind":"string","property":"genre","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/app-item.json","pointer":"/properties/screenshots","kind":"array","property":"screenshots","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/app-item.json","pointer":"/properties/content_rating","kind":"string","property":"content_rating","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/app-item.json","pointer":"/properties/tags","kind":"array","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/app-item.json","pointer":"/properties/tags/items","kind":"string","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/app-item.json","pointer":"/properties/assets","kind":"array","property":"assets","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/offering-asset-group.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/applicable-package-id.json","pointer":"","kind":"string","property":"","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/assets/audio-asset.json","pointer":"/properties/container_format","kind":"string","property":"container_format","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/assets/audio-asset.json","pointer":"/properties/codec","kind":"string","property":"codec","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/assets/card-asset.json","pointer":"/properties/headline","kind":"string","property":"headline","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/assets/card-asset.json","pointer":"/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/assets/card-asset.json","pointer":"/properties/cta","kind":"string","property":"cta","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/assets/card-asset.json","pointer":"/properties/platform_extensions","kind":"array","property":"platform_extensions","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/platform-extension-ref.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/assets/css-asset.json","pointer":"/properties/content","kind":"string","property":"content","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":100000,"tier":"string-body","rationale":"Long-form body; matches content (100,000) and transcript (200,000) already in the schemas.","action":"tighten in 4.0"}, + {"file":"core/assets/css-asset.json","pointer":"/properties/media","kind":"string","property":"media","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/assets/daast-asset.json","pointer":"/oneOf/1/properties/content","kind":"string","property":"content","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":100000,"tier":"string-body","rationale":"Long-form body; matches content (100,000) and transcript (200,000) already in the schemas.","action":"tighten in 4.0"}, + {"file":"core/assets/daast-asset.json","pointer":"/properties/tracking_events","kind":"array","property":"tracking_events","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/daast-tracking-event.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (23 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/assets/daast-asset.json","pointer":"/properties/macro_declarations","kind":"array","property":"macro_declarations","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/macro-declaration.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/assets/daast-tracker-asset.json","pointer":"/properties/macro_declarations","kind":"array","property":"macro_declarations","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/assets/display-tag-asset.json","pointer":"/properties/macro_declarations","kind":"array","property":"macro_declarations","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/macro-declaration.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/assets/html-asset.json","pointer":"/properties/content","kind":"string","property":"content","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":100000,"tier":"string-body","rationale":"Long-form body; matches content (100,000) and transcript (200,000) already in the schemas.","action":"tighten in 4.0"}, + {"file":"core/assets/html-asset.json","pointer":"/properties/version","kind":"string","property":"version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/assets/html-asset.json","pointer":"/properties/accessibility/properties/alt_text","kind":"string","property":"alt_text","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/assets/image-asset.json","pointer":"/properties/state_id","kind":"string","property":"state_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/assets/image-asset.json","pointer":"/properties/breakpoint_id","kind":"string","property":"breakpoint_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/assets/image-asset.json","pointer":"/properties/format","kind":"string","property":"format","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/assets/image-asset.json","pointer":"/properties/alt_text","kind":"string","property":"alt_text","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/assets/javascript-asset.json","pointer":"/properties/content","kind":"string","property":"content","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":100000,"tier":"string-body","rationale":"Long-form body; matches content (100,000) and transcript (200,000) already in the schemas.","action":"tighten in 4.0"}, + {"file":"core/assets/javascript-asset.json","pointer":"/properties/accessibility/properties/alt_text","kind":"string","property":"alt_text","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/assets/markdown-asset.json","pointer":"/properties/content","kind":"string","property":"content","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":100000,"tier":"string-body","rationale":"Long-form body; matches content (100,000) and transcript (200,000) already in the schemas.","action":"tighten in 4.0"}, + {"file":"core/assets/markdown-asset.json","pointer":"/properties/language","kind":"string","property":"language","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/assets/pixel-tracker-asset.json","pointer":"/properties/macro_declarations","kind":"array","property":"macro_declarations","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/assets/pixel-tracker-asset.json","pointer":"/properties/custom_event_name","kind":"string","property":"custom_event_name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/assets/published-post-asset.json","pointer":"/properties/platform","kind":"string","property":"platform","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/assets/published-post-asset.json","pointer":"/properties/platform_post_id","kind":"string","property":"platform_post_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/assets/published-post-asset.json","pointer":"/properties/identity_ref/properties/handle","kind":"string","property":"handle","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/assets/published-post-asset.json","pointer":"/properties/identity_ref/properties/platform_identity_id","kind":"string","property":"platform_identity_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/assets/published-post-asset.json","pointer":"/properties/reference_authorization/properties/authorization_instructions","kind":"string","property":"authorization_instructions","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/assets/text-asset.json","pointer":"/properties/content","kind":"string","property":"content","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":100000,"tier":"string-body","rationale":"Long-form body; matches content (100,000) and transcript (200,000) already in the schemas.","action":"tighten in 4.0"}, + {"file":"core/assets/text-asset.json","pointer":"/properties/language","kind":"string","property":"language","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/assets/url-asset.json","pointer":"/properties/macro_declarations","kind":"array","property":"macro_declarations","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/assets/url-asset.json","pointer":"/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/assets/url-asset.json","pointer":"/properties/state_id","kind":"string","property":"state_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/assets/vast-asset.json","pointer":"/oneOf/1/properties/content","kind":"string","property":"content","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":100000,"tier":"string-body","rationale":"Long-form body; matches content (100,000) and transcript (200,000) already in the schemas.","action":"tighten in 4.0"}, + {"file":"core/assets/vast-asset.json","pointer":"/properties/macro_declarations","kind":"array","property":"macro_declarations","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/macro-declaration.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/assets/vast-asset.json","pointer":"/properties/tracking_events","kind":"array","property":"tracking_events","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/vast-tracking-event.json","proposed_limit":36,"tier":"array-enum","rationale":"Enum-valued items (36 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/assets/vast-tracker-asset.json","pointer":"/properties/macro_declarations","kind":"array","property":"macro_declarations","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/assets/video-asset.json","pointer":"/properties/container_format","kind":"string","property":"container_format","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/assets/video-asset.json","pointer":"/properties/video_codec","kind":"string","property":"video_codec","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/assets/video-asset.json","pointer":"/properties/frame_rate","kind":"string","property":"frame_rate","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/assets/video-asset.json","pointer":"/properties/audio_codec","kind":"string","property":"audio_codec","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/assets/webhook-asset.json","pointer":"/properties/supported_macros","kind":"array","property":"supported_macros","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/assets/webhook-asset.json","pointer":"/properties/supported_macros/items/anyOf/1","kind":"string","property":"supported_macros","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/assets/webhook-asset.json","pointer":"/properties/required_macros","kind":"array","property":"required_macros","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/assets/webhook-asset.json","pointer":"/properties/required_macros/items/anyOf/1","kind":"string","property":"required_macros","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/assets/webhook-asset.json","pointer":"/properties/security/properties/hmac_header","kind":"string","property":"hmac_header","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/assets/webhook-asset.json","pointer":"/properties/security/properties/api_key_header","kind":"string","property":"api_key_header","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/assets/zip-asset.json","pointer":"/properties/entry_point","kind":"string","property":"entry_point","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/assets/zip-asset.json","pointer":"/properties/allowed_inner_extensions","kind":"array","property":"allowed_inner_extensions","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/assets/zip-asset.json","pointer":"/properties/allowed_inner_extensions/items","kind":"string","property":"allowed_inner_extensions","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/assets/zip-asset.json","pointer":"/properties/accessibility/properties/alt_text","kind":"string","property":"alt_text","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/attestation-capabilities.json","pointer":"/properties/accepted_claim_types","kind":"array","property":"accepted_claim_types","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/attestation-capabilities.json","pointer":"/properties/accepted_proof_formats","kind":"array","property":"accepted_proof_formats","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/attestation-capabilities.json","pointer":"/properties/supported_delivery_methods","kind":"array","property":"supported_delivery_methods","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/attestation-capabilities.json","pointer":"/properties/accepted_issuers","kind":"array","property":"accepted_issuers","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/attestation-capabilities.json","pointer":"/properties/accepted_issuers/items/properties/claim_types","kind":"array","property":"claim_types","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/attestation-capabilities.json","pointer":"/properties/accepted_issuers/items/properties/proof_formats","kind":"array","property":"proof_formats","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/attestation-capabilities.json","pointer":"/properties/accepted_issuers/items/properties/credential_origins","kind":"array","property":"credential_origins","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/attestation-capabilities.json","pointer":"/properties/accepted_issuers/items/properties/resolvers","kind":"array","property":"resolvers","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/attestation-capabilities.json","pointer":"/properties/accepted_verifiers","kind":"array","property":"accepted_verifiers","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/attestation-capabilities.json","pointer":"/properties/accepted_verifiers/items/properties/claim_types","kind":"array","property":"claim_types","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/attestation-capabilities.json","pointer":"/properties/accepted_verifiers/items/properties/proof_formats","kind":"array","property":"proof_formats","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/attestation-evaluation.json","pointer":"/properties/reason_codes","kind":"array","property":"reason_codes","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/attestation-evaluation.json","pointer":"/properties/reason_codes/items","kind":"string","property":"reason_codes","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[A-Za-z0-9._:-]+$","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/attestation-reference.json","pointer":"/properties/embedded_credential/properties/value","kind":"string","property":"value","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"core/audience-activation-method.json","pointer":"/oneOf/2/properties/directions","kind":"array","property":"directions","side":"both","stability":"experimental","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"core/audience-characteristic.json","pointer":"/allOf/0/then/properties/value/oneOf/1","kind":"array","property":"value","side":"both","stability":"stable","in_last_stable":"yes","items":"integer","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/audience-characteristic.json","pointer":"/properties/dimension","kind":"string","property":"dimension","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/audience-characteristic.json","pointer":"/properties/value/oneOf/0","kind":"string","property":"value","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"core/audience-characteristic.json","pointer":"/properties/value/oneOf/3","kind":"array","property":"value","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/audience-characteristic.json","pointer":"/properties/value/oneOf/3/items/oneOf/0","kind":"string","property":"value","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"core/audience-characteristic.json","pointer":"/properties/taxonomy/properties/version","kind":"string","property":"version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/audience-characteristic.json","pointer":"/properties/taxonomy/properties/value_id","kind":"string","property":"value_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/audience-characteristic.json","pointer":"/properties/label","kind":"string","property":"label","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/audience-evidence-pin.json","pointer":"/properties/evidence_id","kind":"string","property":"evidence_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/audience-evidence-pin.json","pointer":"/properties/snapshot_id","kind":"string","property":"snapshot_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/audience-evidence-pin.json","pointer":"/properties/version","kind":"string","property":"version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/audience-evidence-requirements.json","pointer":"/properties/accepted_methodologies","kind":"array","property":"accepted_methodologies","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/audience-evidence-methodology.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/audience-evidence-requirements.json","pointer":"/properties/excluded_methodologies","kind":"array","property":"excluded_methodologies","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/audience-evidence-methodology.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/audience-evidence-requirements.json","pointer":"/properties/accepted_evidence_types","kind":"array","property":"accepted_evidence_types","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/audience-evidence-requirements.json","pointer":"/properties/accepted_providers","kind":"array","property":"accepted_providers","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/brand-ref.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/audience-evidence-requirements.json","pointer":"/properties/excluded_providers","kind":"array","property":"excluded_providers","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/brand-ref.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/audience-evidence-requirements.json","pointer":"/properties/accepted_subject_types","kind":"array","property":"accepted_subject_types","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/audience-subject-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/audience-evidence-requirements.json","pointer":"/properties/accepted_resolution_methods","kind":"array","property":"accepted_resolution_methods","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/audience-resolution-method.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/audience-evidence-requirements.json","pointer":"/properties/accepted_attestation_issuers","kind":"array","property":"accepted_attestation_issuers","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/attestation-issuer.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/audience-evidence-requirements.json","pointer":"/properties/accepted_attestation_claim_types","kind":"array","property":"accepted_attestation_claim_types","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/audience-evidence-selection.json","pointer":"/properties/evidence_id","kind":"string","property":"evidence_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/audience-evidence-selection.json","pointer":"/properties/snapshot_id","kind":"string","property":"snapshot_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/audience-evidence-selection.json","pointer":"/properties/version","kind":"string","property":"version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/audience-evidence.json","pointer":"/properties/evidence_id","kind":"string","property":"evidence_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/audience-evidence.json","pointer":"/properties/snapshot_id","kind":"string","property":"snapshot_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/audience-evidence.json","pointer":"/properties/version","kind":"string","property":"version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/audience-evidence.json","pointer":"/properties/baseline/properties/population_id","kind":"string","property":"population_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/audience-evidence.json","pointer":"/properties/baseline/properties/version","kind":"string","property":"version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/audience-evidence.json","pointer":"/properties/baseline/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/audience-member.json","pointer":"/properties/external_id","kind":"string","property":"external_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/audience-member.json","pointer":"/properties/uids","kind":"array","property":"uids","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/audience-member.json","pointer":"/properties/uids/items/properties/value","kind":"string","property":"value","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"core/audience-selector.json","pointer":"/oneOf/1/properties/values","kind":"array","property":"values","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/audience-selector.json","pointer":"/oneOf/1/properties/values/items","kind":"string","property":"values","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/audience-selector.json","pointer":"/oneOf/3/properties/category","kind":"string","property":"category","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/authorized-agent-base.json","pointer":"/properties/signing_keys","kind":"array","property":"signing_keys","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/agent-signing-key.json","proposed_limit":32,"tier":"array-small","rationale":"Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/authorized-agent-base.json","pointer":"/properties/encryption_keys","kind":"array","property":"encryption_keys","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/agent-encryption-key.json","proposed_limit":32,"tier":"array-small","rationale":"Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/bidding-policy-capability.json","pointer":"/definitions/policy_profile/properties/modes","kind":"array","property":"modes","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/bidding-policy-capability.json","pointer":"/definitions/policy_profile/properties/cost_per_strengths","kind":"array","property":"cost_per_strengths","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/bidding-policy-capability.json","pointer":"/definitions/policy_profile/properties/roas_strengths","kind":"array","property":"roas_strengths","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/bidding-policy-capability.json","pointer":"/definitions/policy_profile/properties/supported_combinations","kind":"array","property":"supported_combinations","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/bidding-policy-capability.json","pointer":"/definitions/max_bid_with_cost_per/properties/cost_per_strengths","kind":"array","property":"cost_per_strengths","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/bidding-policy-capability.json","pointer":"/definitions/max_bid_with_roas/properties/roas_strengths","kind":"array","property":"roas_strengths","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/brand-id.json","pointer":"","kind":"string","property":"","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9_]+$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"core/brand-key.json","pointer":"/properties/domain","kind":"string","property":"domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/brand-key.json","pointer":"/properties/countries","kind":"array","property":"countries","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/brand-ref.json","pointer":"/properties/domain","kind":"string","property":"domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/brand-ref.json","pointer":"/properties/countries","kind":"array","property":"countries","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/brand-ref.json","pointer":"/properties/industries","kind":"array","property":"industries","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/brand-ref.json","pointer":"/properties/industries/items","kind":"string","property":"industries","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/brand-ref.json","pointer":"/properties/data_subject_contestation/properties/languages","kind":"array","property":"languages","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 639 / BCP 47 language codes (184 two-letter languages): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/brand-ref.json","pointer":"/properties/data_subject_contestation/properties/languages/items","kind":"string","property":"languages","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/brand-ref.json","pointer":"/properties/brand_kit_override/properties/voice","kind":"string","property":"voice","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/brand-ref.json","pointer":"/properties/brand_kit_override/properties/tagline","kind":"string","property":"tagline","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"One-line marketing text.","action":"tighten in 4.0"}, + {"file":"core/brand-response-authorization-result.json","pointer":"/properties/kid","kind":"string","property":"kid","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/budget-allocation.json","pointer":"/oneOf/1/properties/optimization_goals","kind":"array","property":"optimization_goals","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/business-calendar.json","pointer":"/properties/working_periods/items/properties/days","kind":"array","property":"days","side":"response","stability":"new-3.3","added_in_3_3":true,"in_last_stable":"no","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"core/canonical-account-ref.json","pointer":"/anyOf/0/properties/account_id","kind":"string","property":"account_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-account-ref.json","pointer":"/anyOf/1/properties/operator","kind":"string","property":"operator","side":"request","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-account-ref.json","pointer":"/anyOf/1/properties/timezone","kind":"string","property":"timezone","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/canonical-audience-evidence-selection.json","pointer":"/properties/evidence_id","kind":"string","property":"evidence_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-audience-evidence-selection.json","pointer":"/properties/snapshot_id","kind":"string","property":"snapshot_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-audience-evidence-selection.json","pointer":"/properties/version","kind":"string","property":"version","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/canonical-audience-evidence-selection.json","pointer":"/properties/verified_attestation_digests","kind":"array","property":"verified_attestation_digests","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/canonical-audience-evidence.json","pointer":"/properties/evidence_id","kind":"string","property":"evidence_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-audience-evidence.json","pointer":"/properties/snapshot_id","kind":"string","property":"snapshot_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-audience-evidence.json","pointer":"/properties/version","kind":"string","property":"version","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/canonical-audience-evidence.json","pointer":"/properties/baseline/properties/population_id","kind":"string","property":"population_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-audience-evidence.json","pointer":"/properties/baseline/properties/version","kind":"string","property":"version","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/canonical-audience-evidence.json","pointer":"/properties/baseline/properties/description","kind":"string","property":"description","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-audience-evidence.json","pointer":"/properties/attestation_digests","kind":"array","property":"attestation_digests","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/canonical-budget-allocation.json","pointer":"/oneOf/1/properties/optimization_goals","kind":"array","property":"optimization_goals","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-optimization-goal.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/canonical-delivery-forecast.json","pointer":"/properties/points","kind":"array","property":"points","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-forecast-point.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/canonical-delivery-forecast.json","pointer":"/properties/demographic","kind":"string","property":"demographic","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/canonical-forecast-point.json","pointer":"/properties/product_id","kind":"string","property":"product_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-forecast-point.json","pointer":"/properties/vendor_metric_values","kind":"array","property":"vendor_metric_values","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-forecast-vendor-metric-value.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/canonical-forecast-vendor-metric-value.json","pointer":"/properties/unit","kind":"string","property":"unit","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/canonical-format-option.json","pointer":"/properties/format_option_id","kind":"string","property":"format_option_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-format-option.json","pointer":"/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/canonical-format-option.json","pointer":"/properties/macro_resolution_capabilities","kind":"array","property":"macro_resolution_capabilities","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/macro-resolution-capability.json","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/canonical-format-option.json","pointer":"/properties/display_name","kind":"string","property":"display_name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-format-option.json","pointer":"/properties/applies_to_channels","kind":"array","property":"applies_to_channels","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/channels.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (20 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/canonical-format-option.json","pointer":"/properties/format_shape","kind":"string","property":"format_shape","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/canonical-measurement-terms.json","pointer":"/properties/billing_measurement/properties/measurement_window","kind":"string","property":"measurement_window","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/canonical-measurement-terms.json","pointer":"/properties/makegood_policy/properties/available_remedies","kind":"array","property":"available_remedies","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/makegood-remedy.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/canonical-media-buy-action-fields.json","pointer":"/properties/action","kind":"string","property":"action","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Action name.","action":"tighten in 4.0"}, + {"file":"core/canonical-media-buy-action-fields.json","pointer":"/properties/applicable_package_ids","kind":"array","property":"applicable_package_ids","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/applicable-package-id.json","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/canonical-optimization-goal.json","pointer":"/oneOf/1/properties/event_sources","kind":"array","property":"event_sources","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/canonical-optimization-goal.json","pointer":"/oneOf/1/properties/event_sources/items/properties/event_source_id","kind":"string","property":"event_source_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-optimization-goal.json","pointer":"/oneOf/1/properties/event_sources/items/properties/custom_event_name","kind":"string","property":"custom_event_name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-optimization-goal.json","pointer":"/oneOf/1/properties/event_sources/items/properties/value_field","kind":"string","property":"value_field","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/canonical-placement.json","pointer":"/properties/placement_id","kind":"string","property":"placement_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-placement.json","pointer":"/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/canonical-placement.json","pointer":"/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-placement.json","pointer":"/properties/description","kind":"string","property":"description","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-placement.json","pointer":"/properties/tags","kind":"array","property":"tags","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/canonical-placement.json","pointer":"/properties/tags/items","kind":"string","property":"tags","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/canonical-placement.json","pointer":"/properties/format_options","kind":"array","property":"format_options","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-format-option.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/canonical-placement.json","pointer":"/properties/video_placement_types","kind":"array","property":"video_placement_types","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/video-placement-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/canonical-placement.json","pointer":"/properties/audio_distribution_types","kind":"array","property":"audio_distribution_types","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/audio-distribution-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/canonical-placement.json","pointer":"/properties/sponsored_placement_types","kind":"array","property":"sponsored_placement_types","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/sponsored-placement-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/canonical-placement.json","pointer":"/properties/social_placement_surfaces","kind":"array","property":"social_placement_surfaces","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/social-placement-surface.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/canonical-placement.json","pointer":"/properties/identifiers","kind":"array","property":"identifiers","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/canonical-placement.json","pointer":"/properties/identifiers/items/properties/value","kind":"string","property":"value","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"core/canonical-pricing-option.json","pointer":"/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-pricing-option.json","pointer":"/properties/eligible_adjustments","kind":"array","property":"eligible_adjustments","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/adjustment-kind.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/canonical-pricing-option.json","pointer":"/properties/custom_event_name","kind":"string","property":"custom_event_name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-pricing-option.json","pointer":"/properties/event_source_id","kind":"string","property":"event_source_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-product-action.json","pointer":"/properties/modes","kind":"array","property":"modes","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/canonical-media-buy-action-mode.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/canonical-product-action.json","pointer":"/properties/allowed_statuses","kind":"array","property":"allowed_statuses","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/media-buy-status.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/canonical-product-action.json","pointer":"/properties/terms_ref","kind":"string","property":"terms_ref","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/product_id","kind":"string","property":"product_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/description","kind":"string","property":"description","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/publisher_properties","kind":"array","property":"publisher_properties","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"core/canonical-product.json","pointer":"/properties/channels","kind":"array","property":"channels","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/channels.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (20 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/video_placement_types","kind":"array","property":"video_placement_types","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/video-placement-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/audio_distribution_types","kind":"array","property":"audio_distribution_types","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/audio-distribution-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/sponsored_placement_types","kind":"array","property":"sponsored_placement_types","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/sponsored-placement-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/social_placement_surfaces","kind":"array","property":"social_placement_surfaces","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/social-placement-surface.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/format_options","kind":"array","property":"format_options","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-format-option.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/placements","kind":"array","property":"placements","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-placement.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/collections","kind":"array","property":"collections","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"core/canonical-product.json","pointer":"/properties/pricing_options","kind":"array","property":"pricing_options","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-pricing-option.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/performance_standards","kind":"array","property":"performance_standards","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-performance-standard.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/catalog_types","kind":"array","property":"catalog_types","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/catalog-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (13 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/execution_requirements","kind":"array","property":"execution_requirements","side":"response","stability":"stable","in_last_stable":"yes","marker_conflict":true,"items":"$ref /schemas/core/product-execution-requirement.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/audience_evidence","kind":"array","property":"audience_evidence","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-audience-evidence.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/audience_evidence_selections","kind":"array","property":"audience_evidence_selections","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-audience-evidence-selection.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/catalog_match/properties/matched_gtins","kind":"array","property":"matched_gtins","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/catalog_match/properties/matched_ids","kind":"array","property":"matched_ids","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/catalog_match/properties/matched_ids/items","kind":"string","property":"matched_ids","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/list_applications","kind":"array","property":"list_applications","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/inventory-list-application.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/brief_relevance","kind":"string","property":"brief_relevance","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/canonical-product.json","pointer":"/properties/allowed_actions","kind":"array","property":"allowed_actions","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-product-action.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/canonical-projection-ref.json","pointer":"/properties/slots_override","kind":"array","property":"slots_override","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-projection-slot-override.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/canonical-projection-slot-override.json","pointer":"/properties/asset_group_id","kind":"string","property":"asset_group_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-projection-slot-override.json","pointer":"/properties/asset_type","kind":"string","property":"asset_type","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-proposal.json","pointer":"/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canonical-reporting-capabilities.json","pointer":"/properties/available_reporting_frequencies","kind":"array","property":"available_reporting_frequencies","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/reporting-frequency.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/canonical-reporting-capabilities.json","pointer":"/properties/timezone","kind":"string","property":"timezone","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/canonical-reporting-capabilities.json","pointer":"/properties/reporting_delivery_offering_ids","kind":"array","property":"reporting_delivery_offering_ids","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/reporting-delivery-offering-id.json","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/canonical-reporting-capabilities.json","pointer":"/properties/available_metrics","kind":"array","property":"available_metrics","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/available-metric.json","proposed_limit":51,"tier":"array-enum","rationale":"Enum-valued items (51 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/canonical-reporting-capabilities.json","pointer":"/properties/vendor_metrics","kind":"array","property":"vendor_metrics","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/canonical-reporting-capabilities.json","pointer":"/properties/windowed_pull_granularities","kind":"array","property":"windowed_pull_granularities","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/reporting-frequency.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/canonical-reporting-capabilities.json","pointer":"/properties/measurement_windows","kind":"array","property":"measurement_windows","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/measurement-window.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/canvas-constraint.json","pointer":"/properties/state_id","kind":"string","property":"state_id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/canvas-constraint.json","pointer":"/properties/breakpoint_id","kind":"string","property":"breakpoint_id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/capabilities-changed-webhook.json","pointer":"/properties/changed_paths","kind":"array","property":"changed_paths","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/capabilities-changed-webhook.json","pointer":"/properties/changed_paths/items","kind":"string","property":"changed_paths","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^(/[^\\s]*)$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"core/catalog-field-mapping.json","pointer":"/properties/feed_field","kind":"string","property":"feed_field","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/catalog-field-mapping.json","pointer":"/properties/catalog_field","kind":"string","property":"catalog_field","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/catalog-field-mapping.json","pointer":"/properties/asset_group_id","kind":"string","property":"asset_group_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/catalog-field-mapping.json","pointer":"/properties/format","kind":"string","property":"format","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/catalog-field-mapping.json","pointer":"/properties/timezone","kind":"string","property":"timezone","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"core/catalog-field-mapping.json","pointer":"/properties/separator","kind":"string","property":"separator","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/catalog-ingestion-capability.json","pointer":"/properties/accepted_catalog_types","kind":"array","property":"accepted_catalog_types","side":"both","stability":"new-3.3","added_in_3_3":true,"in_last_stable":"no","items":"$ref /schemas/enums/catalog-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (13 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"core/catalog-ingestion-capability.json","pointer":"/properties/ingestion_modes","kind":"array","property":"ingestion_modes","side":"both","stability":"new-3.3","added_in_3_3":true,"in_last_stable":"no","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"core/catalog-ingestion-capability.json","pointer":"/properties/supported_feed_formats","kind":"array","property":"supported_feed_formats","side":"both","stability":"new-3.3","added_in_3_3":true,"in_last_stable":"no","items":"$ref /schemas/enums/feed-format.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (8 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"core/catalog-ingestion-capability.json","pointer":"/properties/supported_content_id_types","kind":"array","property":"supported_content_id_types","side":"both","stability":"new-3.3","added_in_3_3":true,"in_last_stable":"no","items":"$ref /schemas/enums/content-id-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (12 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"core/catalog-item-availability-state.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/catalog-item-availability-error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"core/catalog-item-availability-update-result.json","pointer":"/properties/catalog_id","kind":"string","property":"catalog_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/catalog-item-availability-update-result.json","pointer":"/properties/item_id","kind":"string","property":"item_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/catalog-item-availability-update-result.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/catalog-item-availability-error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"core/catalog-item-delivery-metrics.json","pointer":"/allOf/1/properties/content_id","kind":"string","property":"content_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/catalog-selection.json","pointer":"/properties/catalog_id","kind":"string","property":"catalog_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/catalog.json","pointer":"/properties/catalog_id","kind":"string","property":"catalog_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/catalog.json","pointer":"/properties/name","kind":"string","property":"name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/catalog.json","pointer":"/properties/items","kind":"array","property":"items","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":10000,"tier":"array-catalog","rationale":"Inline catalog data; matches the 10,000 ceiling for records. Larger catalogs use url.","action":"tighten in 4.0"}, + {"file":"core/catalog.json","pointer":"/properties/ids","kind":"array","property":"ids","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/catalog.json","pointer":"/properties/ids/items","kind":"string","property":"ids","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/catalog.json","pointer":"/properties/gtins","kind":"array","property":"gtins","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/catalog.json","pointer":"/properties/tags","kind":"array","property":"tags","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/catalog.json","pointer":"/properties/tags/items","kind":"string","property":"tags","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/catalog.json","pointer":"/properties/category","kind":"string","property":"category","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/catalog.json","pointer":"/properties/query","kind":"string","property":"query","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/catalog.json","pointer":"/properties/conversion_events","kind":"array","property":"conversion_events","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/event-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (31 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/catalog.json","pointer":"/properties/feed_field_mappings","kind":"array","property":"feed_field_mappings","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/catalog-field-mapping.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/catchment.json","pointer":"/properties/catchment_id","kind":"string","property":"catchment_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/catchment.json","pointer":"/properties/label","kind":"string","property":"label","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/catchment.json","pointer":"/properties/geometry/properties/coordinates","kind":"array","property":"coordinates","side":"other","stability":"stable","in_last_stable":"yes","items":"untyped","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/collection-delivery-metrics.json","pointer":"/allOf/1/properties/collection_name","kind":"string","property":"collection_name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/collection-distribution.json","pointer":"/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/collection-distribution.json","pointer":"/properties/property_ids","kind":"array","property":"property_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/property-id.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"core/collection-distribution.json","pointer":"/properties/identifiers","kind":"array","property":"identifiers","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/collection-distribution.json","pointer":"/properties/identifiers/items/properties/value","kind":"string","property":"value","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"core/collection-list-ref.json","pointer":"/properties/list_id","kind":"string","property":"list_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/collection-list-ref.json","pointer":"/properties/auth_token","kind":"string","property":"auth_token","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"core/collection-property-delivery-metrics.json","pointer":"/allOf/1/properties/collection_name","kind":"string","property":"collection_name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/collection-property-delivery-metrics.json","pointer":"/allOf/1/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/collection-property-delivery-metrics.json","pointer":"/allOf/1/properties/property_name","kind":"string","property":"property_name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/collection-ref.json","pointer":"/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/collection-ref.json","pointer":"/properties/collection_id","kind":"string","property":"collection_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/collection-selection.json","pointer":"/oneOf/0/properties/collections","kind":"array","property":"collections","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"core/collection-selector.json","pointer":"/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/collection-selector.json","pointer":"/properties/collection_ids","kind":"array","property":"collection_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/collection-selector.json","pointer":"/properties/collection_ids/items","kind":"string","property":"collection_ids","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/collection.json","pointer":"/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/collection.json","pointer":"/properties/collection_id","kind":"string","property":"collection_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/collection.json","pointer":"/properties/name","kind":"string","property":"name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/collection.json","pointer":"/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/collection.json","pointer":"/properties/genre","kind":"array","property":"genre","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/collection.json","pointer":"/properties/genre/items","kind":"string","property":"genre","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/collection.json","pointer":"/properties/genre_taxonomy","kind":"string","property":"genre_taxonomy","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/collection.json","pointer":"/properties/language","kind":"string","property":"language","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/collection.json","pointer":"/properties/season","kind":"string","property":"season","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Season identifier.","action":"tighten in 4.0"}, + {"file":"core/collection.json","pointer":"/properties/talent","kind":"array","property":"talent","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/talent.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/collection.json","pointer":"/properties/distribution","kind":"array","property":"distribution","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/collection-distribution.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/collection.json","pointer":"/properties/related_collections","kind":"array","property":"related_collections","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/collection.json","pointer":"/properties/related_collections/items/properties/collection_id","kind":"string","property":"collection_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/committed-metric.json","pointer":"/oneOf/1/properties/methodology_version","kind":"string","property":"methodology_version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/compact-task-input-required.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"core/compact-task-submitted.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"core/content-rating.json","pointer":"/properties/rating","kind":"string","property":"rating","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/creative-approval-scope.json","pointer":"/properties/rejection_reason","kind":"string","property":"rejection_reason","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-asset.json","pointer":"/properties/creative_id","kind":"string","property":"creative_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-asset.json","pointer":"/properties/name","kind":"string","property":"name","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-asset.json","pointer":"/properties/assets/patternProperties/^/oneOf/1","kind":"array","property":"^","side":"request","stability":"stable","in_last_stable":"unknown","items":"$ref /schemas/core/assets/asset-union.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/creative-asset.json","pointer":"/properties/inputs","kind":"array","property":"inputs","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/creative-asset.json","pointer":"/properties/inputs/items/properties/name","kind":"string","property":"name","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-asset.json","pointer":"/properties/inputs/items/properties/macros/additionalProperties","kind":"string","property":"macros","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/creative-asset.json","pointer":"/properties/inputs/items/properties/context_description","kind":"string","property":"context_description","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-asset.json","pointer":"/properties/tags","kind":"array","property":"tags","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/creative-asset.json","pointer":"/properties/tags/items","kind":"string","property":"tags","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/creative-asset.json","pointer":"/properties/placement_refs","kind":"array","property":"placement_refs","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/placement-ref.json","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"core/creative-asset.json","pointer":"/properties/placement_ids","kind":"array","property":"placement_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"core/creative-asset.json","pointer":"/properties/placement_ids/items","kind":"string","property":"placement_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-asset.json","pointer":"/properties/industry_identifiers","kind":"array","property":"industry_identifiers","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/industry-identifier.json","proposed_limit":32,"tier":"array-small","rationale":"Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/creative-asset.json","pointer":"/properties/rights","kind":"array","property":"rights","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/rights-constraint.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/creative-assets.json","pointer":"/patternProperties/^/anyOf/1","kind":"array","property":"^","side":"both","stability":"stable","in_last_stable":"unknown","items":"$ref /schemas/core/assets/asset-union.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/creative-assignment.json","pointer":"/properties/creative_id","kind":"string","property":"creative_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-assignment.json","pointer":"/properties/trackers","kind":"array","property":"trackers","side":"both","stability":"new-3.3","added_in_3_3":true,"in_last_stable":"no","items":"$ref /schemas/core/assignment-tracker.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"withdrawn (#8501)"}, + {"file":"core/creative-assignment.json","pointer":"/properties/group_id","kind":"string","property":"group_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-assignment.json","pointer":"/properties/placement_refs","kind":"array","property":"placement_refs","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/placement-ref.json","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/creative-assignment.json","pointer":"/properties/placement_ids","kind":"array","property":"placement_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/creative-assignment.json","pointer":"/properties/placement_ids/items","kind":"string","property":"placement_ids","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-brief.json","pointer":"/properties/name","kind":"string","property":"name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-brief.json","pointer":"/properties/tone","kind":"string","property":"tone","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/creative-brief.json","pointer":"/properties/audience","kind":"string","property":"audience","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-brief.json","pointer":"/properties/territory","kind":"string","property":"territory","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/creative-brief.json","pointer":"/properties/messaging/properties/headline","kind":"string","property":"headline","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-brief.json","pointer":"/properties/messaging/properties/tagline","kind":"string","property":"tagline","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"One-line marketing text.","action":"tighten in 4.0"}, + {"file":"core/creative-brief.json","pointer":"/properties/messaging/properties/cta","kind":"string","property":"cta","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/creative-brief.json","pointer":"/properties/messaging/properties/key_messages","kind":"array","property":"key_messages","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/creative-brief.json","pointer":"/properties/messaging/properties/key_messages/items","kind":"string","property":"key_messages","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-brief.json","pointer":"/properties/reference_assets","kind":"array","property":"reference_assets","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/reference-asset.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/creative-brief.json","pointer":"/properties/compliance/properties/required_disclosures","kind":"array","property":"required_disclosures","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/creative-brief.json","pointer":"/properties/compliance/properties/required_disclosures/items/properties/text","kind":"string","property":"text","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-brief.json","pointer":"/properties/compliance/properties/required_disclosures/items/properties/jurisdictions","kind":"array","property":"jurisdictions","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/creative-brief.json","pointer":"/properties/compliance/properties/required_disclosures/items/properties/regulation","kind":"string","property":"regulation","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/creative-brief.json","pointer":"/properties/compliance/properties/required_disclosures/items/properties/language","kind":"string","property":"language","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/creative-brief.json","pointer":"/properties/compliance/properties/prohibited_claims","kind":"array","property":"prohibited_claims","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/creative-brief.json","pointer":"/properties/compliance/properties/prohibited_claims/items","kind":"string","property":"prohibited_claims","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/creative-delivery-metrics.json","pointer":"/allOf/1/properties/creative_id","kind":"string","property":"creative_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-delivery-metrics.json","pointer":"/allOf/1/properties/creative_name","kind":"string","property":"creative_name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-filters.json","pointer":"/properties/accounts","kind":"array","property":"accounts","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/account-ref.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/creative-filters.json","pointer":"/properties/statuses","kind":"array","property":"statuses","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/creative-status.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/creative-filters.json","pointer":"/properties/tags","kind":"array","property":"tags","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/creative-filters.json","pointer":"/properties/tags/items","kind":"string","property":"tags","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/creative-filters.json","pointer":"/properties/tags_any","kind":"array","property":"tags_any","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/creative-filters.json","pointer":"/properties/tags_any/items","kind":"string","property":"tags_any","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/creative-filters.json","pointer":"/properties/name_contains","kind":"string","property":"name_contains","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-filters.json","pointer":"/properties/creative_ids/items","kind":"string","property":"creative_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-filters.json","pointer":"/properties/assigned_to_packages","kind":"array","property":"assigned_to_packages","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/creative-filters.json","pointer":"/properties/assigned_to_packages/items","kind":"string","property":"assigned_to_packages","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-filters.json","pointer":"/properties/media_buy_ids","kind":"array","property":"media_buy_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"core/creative-filters.json","pointer":"/properties/media_buy_ids/items","kind":"string","property":"media_buy_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-filters.json","pointer":"/properties/indicator_types","kind":"array","property":"indicator_types","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/indicator-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (9 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/creative-filters.json","pointer":"/properties/concept_ids","kind":"array","property":"concept_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"core/creative-filters.json","pointer":"/properties/concept_ids/items","kind":"string","property":"concept_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-filters.json","pointer":"/properties/format_ids","kind":"array","property":"format_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"core/creative-filters.json","pointer":"/properties/format_kinds","kind":"array","property":"format_kinds","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-format-kind.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (16 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/creative-filters.json","pointer":"/properties/asset_types","kind":"array","property":"asset_types","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/asset-content-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (17 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/creative-item.json","pointer":"/oneOf/0/properties/asset_type","kind":"string","property":"asset_type","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-item.json","pointer":"/oneOf/0/properties/asset_id","kind":"string","property":"asset_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-item.json","pointer":"/oneOf/1/properties/asset_type","kind":"string","property":"asset_type","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-item.json","pointer":"/oneOf/1/properties/asset_id","kind":"string","property":"asset_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-item.json","pointer":"/oneOf/1/properties/content/oneOf/0","kind":"string","property":"content","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":100000,"tier":"string-body","rationale":"Long-form body; matches content (100,000) and transcript (200,000) already in the schemas.","action":"tighten in 4.0"}, + {"file":"core/creative-item.json","pointer":"/oneOf/1/properties/content/oneOf/1","kind":"array","property":"content","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/creative-item.json","pointer":"/oneOf/1/properties/content/oneOf/1/items","kind":"string","property":"content","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":100000,"tier":"string-body","rationale":"Long-form body; matches content (100,000) and transcript (200,000) already in the schemas.","action":"tighten in 4.0"}, + {"file":"core/creative-localization-readback.json","pointer":"/definitions/resolvedAssets/patternProperties/^[a-z0-9_]+$/anyOf/1","kind":"array","property":"^[a-z0-9_]+$","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/localized-creative-asset.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/creative-localization.json","pointer":"/properties/target_variants/items/properties/assets/patternProperties/^[a-z0-9_]+$/anyOf/1","kind":"array","property":"^[a-z0-9_]+$","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/localized-creative-asset.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/creative-manifest.json","pointer":"/allOf/1/then/properties/assets/patternProperties/.*/allOf/1/if","kind":"array","property":".*","side":"both","stability":"stable","in_last_stable":"yes","items":"untyped","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/creative-manifest.json","pointer":"/properties/assets/patternProperties/^/oneOf/1","kind":"array","property":"^","side":"both","stability":"stable","in_last_stable":"unknown","items":"$ref /schemas/core/assets/asset-union.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/creative-manifest.json","pointer":"/properties/rights","kind":"array","property":"rights","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/rights-constraint.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/creative-manifest.json","pointer":"/properties/industry_identifiers","kind":"array","property":"industry_identifiers","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/industry-identifier.json","proposed_limit":32,"tier":"array-small","rationale":"Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/creative-operation-format-declaration.json","pointer":"/properties/format_option_id","kind":"string","property":"format_option_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-operation-format-declaration.json","pointer":"/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/creative-operation-format-declaration.json","pointer":"/properties/macro_resolution_capabilities","kind":"array","property":"macro_resolution_capabilities","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/macro-resolution-capability.json","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/creative-operation-format-declaration.json","pointer":"/properties/display_name","kind":"string","property":"display_name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-operation-format-declaration.json","pointer":"/properties/applies_to_channels","kind":"array","property":"applies_to_channels","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/channels.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (20 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/creative-operation-format-declaration.json","pointer":"/properties/format_shape","kind":"string","property":"format_shape","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/creative-operation-format-declaration.json","pointer":"/properties/v1_format_ref","kind":"array","property":"v1_format_ref","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/creative-policy.json","pointer":"/properties/accepted_verifiers","kind":"array","property":"accepted_verifiers","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/creative-policy.json","pointer":"/properties/accepted_verifiers/items/properties/feature_id","kind":"string","property":"feature_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-policy.json","pointer":"/properties/accepted_verifiers/items/properties/providers","kind":"array","property":"providers","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/creative-policy.json","pointer":"/properties/accepted_verifiers/items/properties/providers/items","kind":"string","property":"providers","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/creative-representation-set.json","pointer":"/properties/creative_id","kind":"string","property":"creative_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-representation-set.json","pointer":"/properties/name","kind":"string","property":"name","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-representation-set.json","pointer":"/properties/representations","kind":"array","property":"representations","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/creative-representation.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/creative-representation.json","pointer":"/allOf/2/then/properties/assets/patternProperties/.*/allOf/1/if","kind":"array","property":".*","side":"request","stability":"stable","in_last_stable":"yes","items":"untyped","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/creative-representation.json","pointer":"/properties/representation_id","kind":"string","property":"representation_id","side":"request","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-representation.json","pointer":"/properties/source/properties/system","kind":"string","property":"system","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/creative-representation.json","pointer":"/properties/source/properties/source_representation","kind":"string","property":"source_representation","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-representation.json","pointer":"/properties/source/properties/source_id","kind":"string","property":"source_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-variable.json","pointer":"/properties/variable_id","kind":"string","property":"variable_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-variable.json","pointer":"/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-variable.json","pointer":"/properties/default_value","kind":"string","property":"default_value","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/creative-variant.json","pointer":"/allOf/1/properties/variant_id","kind":"string","property":"variant_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-variant.json","pointer":"/allOf/1/properties/generation_context/properties/context_type","kind":"string","property":"context_type","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/creative-variant.json","pointer":"/allOf/1/properties/generation_context/properties/artifact/properties/artifact_id","kind":"string","property":"artifact_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/daast-tracker-constraints.json","pointer":"/definitions/daast_versions","kind":"array","property":"daast_versions","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/daast-version.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/data-provider-signal-selector.json","pointer":"/oneOf/0/properties/data_provider_domain","kind":"string","property":"data_provider_domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/data-provider-signal-selector.json","pointer":"/oneOf/1/properties/data_provider_domain","kind":"string","property":"data_provider_domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/data-provider-signal-selector.json","pointer":"/oneOf/1/properties/signal_ids","kind":"array","property":"signal_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/data-provider-signal-selector.json","pointer":"/oneOf/1/properties/signal_ids/items","kind":"string","property":"signal_ids","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/data-provider-signal-selector.json","pointer":"/oneOf/2/properties/data_provider_domain","kind":"string","property":"data_provider_domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/data-provider-signal-selector.json","pointer":"/oneOf/2/properties/signal_tags","kind":"array","property":"signal_tags","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/data-provider-signal-selector.json","pointer":"/oneOf/2/properties/signal_tags/items","kind":"string","property":"signal_tags","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9_-]+$","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/daypart-target.json","pointer":"/properties/days","kind":"array","property":"days","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/day-of-week.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/daypart-target.json","pointer":"/properties/label","kind":"string","property":"label","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/deadline-policy.json","pointer":"/properties/material_stages","kind":"array","property":"material_stages","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/deadline-policy.json","pointer":"/properties/material_stages/items/properties/stage","kind":"string","property":"stage","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/deadline-policy.json","pointer":"/properties/material_stages/items/properties/label","kind":"string","property":"label","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/delivery-forecast.json","pointer":"/properties/points","kind":"array","property":"points","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/forecast-point.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/delivery-forecast.json","pointer":"/properties/currency","kind":"string","property":"currency","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"core/delivery-forecast.json","pointer":"/properties/demographic","kind":"string","property":"demographic","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/delivery-metrics.json","pointer":"/properties/by_event_type","kind":"array","property":"by_event_type","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/delivery-metrics.json","pointer":"/properties/by_event_type/items/properties/event_source_id","kind":"string","property":"event_source_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/delivery-metrics.json","pointer":"/properties/time_based_views","kind":"array","property":"time_based_views","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/delivery-metrics.json","pointer":"/properties/dooh_metrics/properties/calculation_notes","kind":"string","property":"calculation_notes","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/delivery-metrics.json","pointer":"/properties/dooh_metrics/properties/venue_breakdown","kind":"array","property":"venue_breakdown","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/delivery-metrics.json","pointer":"/properties/dooh_metrics/properties/venue_breakdown/items/properties/venue_id","kind":"string","property":"venue_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/delivery-metrics.json","pointer":"/properties/dooh_metrics/properties/venue_breakdown/items/properties/venue_name","kind":"string","property":"venue_name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/delivery-metrics.json","pointer":"/properties/dooh_metrics/properties/venue_breakdown/items/properties/venue_type","kind":"string","property":"venue_type","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/delivery-metrics.json","pointer":"/properties/viewability/properties/viewed_seconds_histogram","kind":"array","property":"viewed_seconds_histogram","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/delivery-metrics.json","pointer":"/properties/by_action_source","kind":"array","property":"by_action_source","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/delivery-metrics.json","pointer":"/properties/by_action_source/items/properties/event_source_id","kind":"string","property":"event_source_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/delivery-metrics.json","pointer":"/properties/vendor_metric_values","kind":"array","property":"vendor_metric_values","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/vendor-metric-value.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/delivery-provider.json","pointer":"/properties/domain","kind":"string","property":"domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/demographic-reporting-capability.json","pointer":"/properties/age/properties/reporting_modes","kind":"array","property":"reporting_modes","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/demographic-reporting-capability.json","pointer":"/properties/age/properties/intervals","kind":"array","property":"intervals","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/demographic-reporting-capability.json","pointer":"/properties/age/properties/intervals/items/properties/demographic","kind":"string","property":"demographic","side":"both","stability":"stable","in_last_stable":"yes","pattern":"\\S","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"core/demographic-reporting-capability.json","pointer":"/properties/demographic_systems","kind":"array","property":"demographic_systems","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/demographic-system.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (9 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/demographic-targeting-capability.json","pointer":"/properties/age/properties/execution_modes","kind":"array","property":"execution_modes","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/demographic-targeting-capability.json","pointer":"/properties/age/properties/supported_bases","kind":"array","property":"supported_bases","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/age-determination-basis.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/demographic-targeting-capability.json","pointer":"/properties/age/properties/supported_verification_methods","kind":"array","property":"supported_verification_methods","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/age-verification-method.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/demographic-targeting-capability.json","pointer":"/properties/age/properties/intervals","kind":"array","property":"intervals","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/demographic-targeting-capability.json","pointer":"/properties/age/properties/intervals/items/properties/interval_id","kind":"string","property":"interval_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/demographic-targeting-intent.json","pointer":"/properties/age/allOf/1/properties/accepted_bases","kind":"array","property":"accepted_bases","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/age-determination-basis.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/demographic-targeting-intent.json","pointer":"/properties/age/allOf/1/properties/accepted_verification_methods","kind":"array","property":"accepted_verification_methods","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/age-verification-method.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/demographic-targeting-resolution.json","pointer":"/properties/execution/oneOf/1/properties/interval_ids","kind":"array","property":"interval_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/demographic-targeting-resolution.json","pointer":"/properties/execution/oneOf/1/properties/interval_ids/items","kind":"string","property":"interval_ids","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/demographic-targeting-resolution.json","pointer":"/properties/execution/oneOf/2/properties/signal_refs","kind":"array","property":"signal_refs","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/signal-ref.json","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/demographic-targeting-resolution.json","pointer":"/properties/applied_bases","kind":"array","property":"applied_bases","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/age-determination-basis.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/demographic-targeting-resolution.json","pointer":"/properties/applied_verification_methods","kind":"array","property":"applied_verification_methods","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/age-verification-method.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/deployment.json","pointer":"/oneOf/0/properties/platform","kind":"string","property":"platform","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/deployment.json","pointer":"/oneOf/0/properties/account","kind":"string","property":"account","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/deployment.json","pointer":"/oneOf/1/properties/account","kind":"string","property":"account","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/destination-item.json","pointer":"/properties/destination_id","kind":"string","property":"destination_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/destination-item.json","pointer":"/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/destination-item.json","pointer":"/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/destination-item.json","pointer":"/properties/city","kind":"string","property":"city","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":100,"tier":"string-id","rationale":"City name.","action":"tighten in 4.0"}, + {"file":"core/destination-item.json","pointer":"/properties/region","kind":"string","property":"region","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/destination-item.json","pointer":"/properties/tags","kind":"array","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/destination-item.json","pointer":"/properties/tags/items","kind":"string","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/destination-item.json","pointer":"/properties/assets","kind":"array","property":"assets","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/offering-asset-group.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/destination.json","pointer":"/oneOf/0/properties/platform","kind":"string","property":"platform","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/destination.json","pointer":"/oneOf/0/properties/account","kind":"string","property":"account","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/destination.json","pointer":"/oneOf/1/properties/account","kind":"string","property":"account","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/diagnostic-issue.json","pointer":"/properties/message","kind":"string","property":"message","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/downstream-connection-requirement.json","pointer":"/properties/provider","kind":"string","property":"provider","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/downstream-connection-requirement.json","pointer":"/properties/required_for","kind":"array","property":"required_for","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/downstream-connection-requirement.json","pointer":"/properties/required_for/items","kind":"string","property":"required_for","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/downstream-connection-requirement.json","pointer":"/properties/connection_id","kind":"string","property":"connection_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/downstream-connection-requirement.json","pointer":"/properties/resource_ref/properties/platform_account_id","kind":"string","property":"platform_account_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/downstream-connection-requirement.json","pointer":"/properties/resource_ref/properties/identity_id","kind":"string","property":"identity_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/downstream-connection-requirement.json","pointer":"/properties/resource_ref/properties/handle","kind":"string","property":"handle","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/downstream-connection-requirement.json","pointer":"/properties/resource_ref/properties/post_id","kind":"string","property":"post_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/downstream-connection-requirement.json","pointer":"/properties/authorization_instructions","kind":"string","property":"authorization_instructions","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/education-item.json","pointer":"/properties/program_id","kind":"string","property":"program_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/education-item.json","pointer":"/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/education-item.json","pointer":"/properties/school","kind":"string","property":"school","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/education-item.json","pointer":"/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/education-item.json","pointer":"/properties/subject","kind":"string","property":"subject","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/education-item.json","pointer":"/properties/duration","kind":"string","property":"duration","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/education-item.json","pointer":"/properties/language","kind":"string","property":"language","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/education-item.json","pointer":"/properties/location","kind":"string","property":"location","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2048,"tier":"string-url","rationale":"URL-shaped value; 2,048 is the repository default and the common browser limit.","action":"tighten in 4.0"}, + {"file":"core/education-item.json","pointer":"/properties/tags","kind":"array","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/education-item.json","pointer":"/properties/tags/items","kind":"string","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/education-item.json","pointer":"/properties/assets","kind":"array","property":"assets","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/offering-asset-group.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/error.json","pointer":"/properties/message","kind":"string","property":"message","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/error.json","pointer":"/properties/buyer_reason/properties/message","kind":"string","property":"message","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/error.json","pointer":"/properties/field","kind":"string","property":"field","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/error.json","pointer":"/properties/suggestion","kind":"string","property":"suggestion","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/error.json","pointer":"/properties/issues","kind":"array","property":"issues","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"core/error.json","pointer":"/properties/issues/items/properties/pointer","kind":"string","property":"pointer","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/error.json","pointer":"/properties/issues/items/properties/message","kind":"string","property":"message","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/error.json","pointer":"/properties/issues/items/properties/keyword","kind":"string","property":"keyword","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/error.json","pointer":"/properties/issues/items/properties/schemaPath","kind":"string","property":"schemaPath","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/error.json","pointer":"/properties/issues/items/properties/schema_id","kind":"string","property":"schema_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/error.json","pointer":"/properties/issues/items/properties/discriminator","kind":"array","property":"discriminator","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/error.json","pointer":"/properties/issues/items/properties/discriminator/items/properties/property_name","kind":"string","property":"property_name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/error.json","pointer":"/properties/issues/items/properties/discriminator/items/properties/value","kind":"string","property":"value","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"core/error.json","pointer":"/properties/sdk_id","kind":"string","property":"sdk_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/event-custom-data.json","pointer":"/properties/order_id","kind":"string","property":"order_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/event-custom-data.json","pointer":"/properties/content_ids","kind":"array","property":"content_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"core/event-custom-data.json","pointer":"/properties/content_ids/items","kind":"string","property":"content_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/event-custom-data.json","pointer":"/properties/content_type","kind":"string","property":"content_type","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/event-custom-data.json","pointer":"/properties/content_name","kind":"string","property":"content_name","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/event-custom-data.json","pointer":"/properties/content_category","kind":"string","property":"content_category","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/event-custom-data.json","pointer":"/properties/search_string","kind":"string","property":"search_string","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/event-custom-data.json","pointer":"/properties/contents","kind":"array","property":"contents","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/event-custom-data.json","pointer":"/properties/contents/items/properties/id","kind":"string","property":"id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/event-custom-data.json","pointer":"/properties/contents/items/properties/brand","kind":"string","property":"brand","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/event-source-health.json","pointer":"/properties/detail/properties/label","kind":"string","property":"label","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/event-source-health.json","pointer":"/properties/issues","kind":"array","property":"issues","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/diagnostic-issue.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"core/event.json","pointer":"/properties/custom_event_name","kind":"string","property":"custom_event_name","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/feature-requirement.json","pointer":"/properties/feature_id","kind":"string","property":"feature_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/feature-requirement.json","pointer":"/properties/allowed_values","kind":"array","property":"allowed_values","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/feature-requirement.json","pointer":"/properties/policy_id","kind":"string","property":"policy_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/flight-item.json","pointer":"/properties/flight_id","kind":"string","property":"flight_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/flight-item.json","pointer":"/properties/origin/properties/city","kind":"string","property":"city","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":100,"tier":"string-id","rationale":"City name.","action":"tighten in 4.0"}, + {"file":"core/flight-item.json","pointer":"/properties/destination/properties/city","kind":"string","property":"city","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":100,"tier":"string-id","rationale":"City name.","action":"tighten in 4.0"}, + {"file":"core/flight-item.json","pointer":"/properties/airline","kind":"string","property":"airline","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/flight-item.json","pointer":"/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/flight-item.json","pointer":"/properties/tags","kind":"array","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/flight-item.json","pointer":"/properties/tags/items","kind":"string","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/flight-item.json","pointer":"/properties/assets","kind":"array","property":"assets","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/offering-asset-group.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/forecast-dimension-audience.json","pointer":"/properties/audience_id","kind":"string","property":"audience_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/forecast-dimension-audience.json","pointer":"/properties/audience_name","kind":"string","property":"audience_name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/forecast-dimension-geo.json","pointer":"/properties/system","kind":"string","property":"system","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/forecast-dimension-geo.json","pointer":"/properties/geo_code","kind":"string","property":"geo_code","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"core/forecast-dimension-geo.json","pointer":"/properties/geo_name","kind":"string","property":"geo_name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/forecast-dimension-placement.json","pointer":"/properties/placement_name","kind":"string","property":"placement_name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/forecast-dimension-signal.json","pointer":"/allOf/1/then/properties/signal_value","kind":"string","property":"signal_value","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/forecast-dimension-signal.json","pointer":"/properties/signal_id","kind":"string","property":"signal_id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/forecast-dimension-signal.json","pointer":"/properties/signal_value","kind":"string","property":"signal_value","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/forecast-dimension-signal.json","pointer":"/properties/signal_name","kind":"string","property":"signal_name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/forecast-dimension-signal.json","pointer":"/properties/signal_value_name","kind":"string","property":"signal_value_name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/forecast-point-dimensions.json","pointer":"","kind":"array","property":"","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/forecast-point.json","pointer":"/properties/product_id","kind":"string","property":"product_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/forecast-point.json","pointer":"/properties/vendor_metric_values","kind":"array","property":"vendor_metric_values","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/forecast-vendor-metric-value.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/forecast-vendor-metric-value.json","pointer":"/properties/unit","kind":"string","property":"unit","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/format-id.json","pointer":"/properties/id","kind":"string","property":"id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/format-option-ref.json","pointer":"/oneOf/0/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/format-option-ref.json","pointer":"/oneOf/0/properties/format_option_id","kind":"string","property":"format_option_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/format-option-ref.json","pointer":"/oneOf/1/properties/format_option_id","kind":"string","property":"format_option_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/properties/description","kind":"string","property":"description","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/properties/accepts_parameters","kind":"array","property":"accepts_parameters","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/format-id-parameter.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/properties/renders","kind":"array","property":"renders","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/properties/renders/items/properties/role","kind":"string","property":"role","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/properties/renders/items/properties/dimensions/properties/aspect_ratio","kind":"string","property":"aspect_ratio","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^\\d+(\\.\\d+)?:\\d+(\\.\\d+)?$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/properties/assets","kind":"array","property":"assets","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/properties/assets/items/oneOf/1/properties/asset_group_id","kind":"string","property":"asset_group_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/properties/assets/items/oneOf/1/properties/assets","kind":"array","property":"assets","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/properties/supported_macros","kind":"array","property":"supported_macros","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/properties/supported_macros/items/anyOf/1","kind":"string","property":"supported_macros","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/properties/input_format_ids","kind":"array","property":"input_format_ids","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/properties/output_format_ids","kind":"array","property":"output_format_ids","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/properties/supported_disclosure_positions","kind":"array","property":"supported_disclosure_positions","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/disclosure-position.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (8 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/properties/disclosure_capabilities","kind":"array","property":"disclosure_capabilities","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/properties/disclosure_capabilities/items/properties/persistence","kind":"array","property":"persistence","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/disclosure-persistence.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/properties/reported_metrics","kind":"array","property":"reported_metrics","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/available-metric.json","proposed_limit":51,"tier":"array-enum","rationale":"Enum-valued items (51 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/properties/pricing_options","kind":"array","property":"pricing_options","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/vendor-pricing-option.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/$defs/baseIndividualAsset/properties/asset_id","kind":"string","property":"asset_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/$defs/baseIndividualAsset/properties/asset_role","kind":"string","property":"asset_role","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/$defs/baseIndividualAsset/properties/overlays","kind":"array","property":"overlays","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/overlay.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/$defs/baseIndividualAsset/properties/asset_group_id","kind":"string","property":"asset_group_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/$defs/baseGroupAsset/properties/asset_id","kind":"string","property":"asset_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/$defs/baseGroupAsset/properties/asset_role","kind":"string","property":"asset_role","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/$defs/baseGroupAsset/properties/asset_group_id","kind":"string","property":"asset_group_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/format.json","pointer":"/$defs/baseGroupAsset/properties/overlays","kind":"array","property":"overlays","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/overlay.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/frequency-cap-constraints.json","pointer":"/properties/mutable_fields","kind":"array","property":"mutable_fields","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/frequency-cap-mutable-field.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/frequency-cap-constraints.json","pointer":"/properties/supported_control_modes","kind":"array","property":"supported_control_modes","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/frequency-cap-control-mode.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/frequency-cap-constraints.json","pointer":"/properties/supported_per_units","kind":"array","property":"supported_per_units","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/reach-unit.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/frequency-cap-constraints.json","pointer":"/properties/window_constraints","kind":"array","property":"window_constraints","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/frequency-cap-interval-constraints.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/frequency-cap-constraints.json","pointer":"/properties/suppression_constraints","kind":"array","property":"suppression_constraints","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/frequency-cap-interval-constraints.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/frequency-cap-impression-constraints.json","pointer":"/properties/allowed_values","kind":"array","property":"allowed_values","side":"both","stability":"stable","in_last_stable":"yes","items":"integer","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/frequency-cap-interval-constraints.json","pointer":"/properties/allowed_intervals","kind":"array","property":"allowed_intervals","side":"both","stability":"stable","in_last_stable":"yes","items":"integer","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/frequency-cap-requirements.json","pointer":"/properties/mutable_fields","kind":"array","property":"mutable_fields","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/frequency-cap-mutable-field.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/frequency-cap-requirements.json","pointer":"/properties/supported_control_modes","kind":"array","property":"supported_control_modes","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/frequency-cap-control-mode.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/frequency-cap-requirements.json","pointer":"/properties/supported_per_units","kind":"array","property":"supported_per_units","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/reach-unit.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/frequency-cap-requirements.json","pointer":"/properties/supported_window_units","kind":"array","property":"supported_window_units","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/frequency-cap-duration-unit.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/frequency-cap-requirements.json","pointer":"/properties/supported_suppression_units","kind":"array","property":"supported_suppression_units","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/frequency-cap-duration-unit.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/generation-credential.json","pointer":"/properties/provider","kind":"string","property":"provider","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/generation-credential.json","pointer":"/properties/rights_key","kind":"string","property":"rights_key","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/generation-credential.json","pointer":"/properties/uses","kind":"array","property":"uses","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/right-use.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (12 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/geo-delivery-metrics.json","pointer":"/allOf/1/properties/system","kind":"string","property":"system","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/geo-delivery-metrics.json","pointer":"/allOf/1/properties/geo_code","kind":"string","property":"geo_code","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"core/geo-delivery-metrics.json","pointer":"/allOf/1/properties/geo_name","kind":"string","property":"geo_name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/geo-metro.json","pointer":"/properties/values","kind":"array","property":"values","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/geo-metro.json","pointer":"/properties/values/items","kind":"string","property":"values","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/geo-place-area.json","pointer":"/allOf/0/then/properties/values/items","kind":"string","property":"values","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[0-9]+$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"core/geo-place-area.json","pointer":"/properties/system_version","kind":"string","property":"system_version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/geo-place-area.json","pointer":"/properties/values","kind":"array","property":"values","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/geo-place-area.json","pointer":"/properties/values/items","kind":"string","property":"values","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/geo-place-area.json","pointer":"/properties/value_labels/additionalProperties","kind":"string","property":"value_labels","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/geo-place-catalog-capability.json","pointer":"/properties/current_version","kind":"string","property":"current_version","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/geo-place-catalog-capability.json","pointer":"/properties/supported_versions","kind":"array","property":"supported_versions","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/geo-place-catalog-capability.json","pointer":"/properties/supported_versions/items","kind":"string","property":"supported_versions","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/geo-place-catalog-entry.json","pointer":"/properties/value","kind":"string","property":"value","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"core/geo-place-catalog-entry.json","pointer":"/properties/label","kind":"string","property":"label","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/geo-place-catalog-entry.json","pointer":"/properties/canonical_name","kind":"string","property":"canonical_name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/geo-place-catalog-entry.json","pointer":"/properties/parent_labels","kind":"array","property":"parent_labels","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/geo-place-catalog-entry.json","pointer":"/properties/parent_labels/items","kind":"string","property":"parent_labels","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/geo-place-catalog-entry.json","pointer":"/properties/replaced_by_values","kind":"array","property":"replaced_by_values","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/geo-place-catalog-entry.json","pointer":"/properties/replaced_by_values/items","kind":"string","property":"replaced_by_values","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/geo-place-requirement.json","pointer":"/definitions/catalogRequirement/properties/countries/additionalProperties","kind":"array","property":"countries","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/geo-place-type.json","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/geo-place-requirement.json","pointer":"/definitions/catalogRequirement/properties/system_versions","kind":"array","property":"system_versions","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/geo-place-requirement.json","pointer":"/definitions/catalogRequirement/properties/system_versions/items","kind":"string","property":"system_versions","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/geo-place-support.json","pointer":"/properties/countries/additionalProperties","kind":"array","property":"countries","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/geo-place-type.json","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/geo-region-requirement.json","pointer":"/properties/countries/additionalProperties/anyOf/1/properties/values","kind":"array","property":"values","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/geo-region-support.json","pointer":"/properties/countries/additionalProperties/anyOf/1/properties/values","kind":"array","property":"values","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/geo-region-support.json","pointer":"/properties/catalog_version","kind":"string","property":"catalog_version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/get-geo-place-resolution-request.json","pointer":"/properties/q","kind":"string","property":"q","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/get-geo-place-resolution-request.json","pointer":"/properties/value","kind":"string","property":"value","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"core/get-geo-place-resolution-request.json","pointer":"/properties/system_version","kind":"string","property":"system_version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/get-geo-place-resolution-request.json","pointer":"/properties/cursor","kind":"string","property":"cursor","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"core/get-geo-place-resolution-response.json","pointer":"/properties/system_version","kind":"string","property":"system_version","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/get-geo-place-resolution-response.json","pointer":"/properties/matches","kind":"array","property":"matches","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/geo-place-catalog-entry.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/get-geo-place-resolution-response.json","pointer":"/properties/next_cursor","kind":"string","property":"next_cursor","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"core/hotel-item.json","pointer":"/properties/hotel_id","kind":"string","property":"hotel_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/hotel-item.json","pointer":"/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/hotel-item.json","pointer":"/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/hotel-item.json","pointer":"/properties/address/properties/street","kind":"string","property":"street","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":200,"tier":"string-id","rationale":"Matches street fields already bounded at 200.","action":"tighten in 4.0"}, + {"file":"core/hotel-item.json","pointer":"/properties/address/properties/city","kind":"string","property":"city","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":100,"tier":"string-id","rationale":"City name.","action":"tighten in 4.0"}, + {"file":"core/hotel-item.json","pointer":"/properties/address/properties/region","kind":"string","property":"region","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/hotel-item.json","pointer":"/properties/address/properties/postal_code","kind":"string","property":"postal_code","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/hotel-item.json","pointer":"/properties/phone","kind":"string","property":"phone","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":30,"tier":"string-code","rationale":"Matches the phone fields already bounded at 30.","action":"tighten in 4.0"}, + {"file":"core/hotel-item.json","pointer":"/properties/amenities","kind":"array","property":"amenities","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/hotel-item.json","pointer":"/properties/amenities/items","kind":"string","property":"amenities","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/hotel-item.json","pointer":"/properties/tags","kind":"array","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/hotel-item.json","pointer":"/properties/tags/items","kind":"string","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/hotel-item.json","pointer":"/properties/assets","kind":"array","property":"assets","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/offering-asset-group.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/identifier.json","pointer":"/properties/value","kind":"string","property":"value","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"core/identity-relying-party.json","pointer":"/properties/scheme","kind":"string","property":"scheme","side":"other","stability":"stable","added_in_3_3":true,"in_last_stable":"no","marker_conflict":true,"proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/identity-relying-party.json","pointer":"/properties/relying_party_id","kind":"string","property":"relying_party_id","side":"other","stability":"stable","added_in_3_3":true,"in_last_stable":"no","marker_conflict":true,"proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/impairment.json","pointer":"/properties/impairment_id","kind":"string","property":"impairment_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/impairment.json","pointer":"/properties/resource_id","kind":"string","property":"resource_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/impairment.json","pointer":"/properties/package_ids","kind":"array","property":"package_ids","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/impairment.json","pointer":"/properties/package_ids/items","kind":"string","property":"package_ids","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/impairment.json","pointer":"/properties/transition/properties/from","kind":"string","property":"from","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"core/indicator-bearing.json","pointer":"/properties/indicators","kind":"array","property":"indicators","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/indicator.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/indicator-bearing.json","pointer":"/properties/indicator_types_evaluated","kind":"array","property":"indicator_types_evaluated","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/indicator-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (9 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/indicator-bearing.json","pointer":"/properties/indicators_evaluated_scope","kind":"array","property":"indicators_evaluated_scope","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/indicator-scope.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/indicator-scope.json","pointer":"/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/indicator-scope.json","pointer":"/properties/placement_id","kind":"string","property":"placement_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/indicator.json","pointer":"/properties/scope","kind":"array","property":"scope","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/indicator-scope.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/indicators-changed-webhook.json","pointer":"/properties/account_id","kind":"string","property":"account_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/indicators-changed-webhook.json","pointer":"/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/indicators-changed-webhook.json","pointer":"/properties/package_id","kind":"string","property":"package_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/indicators-changed-webhook.json","pointer":"/properties/creative_id","kind":"string","property":"creative_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/indicators-changed-webhook.json","pointer":"/properties/changed_indicator_types","kind":"array","property":"changed_indicator_types","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/indicator-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (9 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/installment-deadlines.json","pointer":"/properties/material_deadlines","kind":"array","property":"material_deadlines","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/material-deadline.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/installment-delivery-metrics.json","pointer":"/allOf/1/properties/installment_name","kind":"string","property":"installment_name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/installment-property-delivery-metrics.json","pointer":"/allOf/1/properties/installment_name","kind":"string","property":"installment_name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/installment-property-delivery-metrics.json","pointer":"/allOf/1/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/installment-property-delivery-metrics.json","pointer":"/allOf/1/properties/property_name","kind":"string","property":"property_name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/installment-ref.json","pointer":"/properties/installment_id","kind":"string","property":"installment_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/installment.json","pointer":"/properties/installment_id","kind":"string","property":"installment_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/installment.json","pointer":"/properties/collection_id","kind":"string","property":"collection_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/installment.json","pointer":"/properties/name","kind":"string","property":"name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/installment.json","pointer":"/properties/season","kind":"string","property":"season","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Season identifier.","action":"tighten in 4.0"}, + {"file":"core/installment.json","pointer":"/properties/installment_number","kind":"string","property":"installment_number","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Installment number within a season.","action":"tighten in 4.0"}, + {"file":"core/installment.json","pointer":"/properties/topics","kind":"array","property":"topics","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/installment.json","pointer":"/properties/topics/items","kind":"string","property":"topics","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/installment.json","pointer":"/properties/guest_talent","kind":"array","property":"guest_talent","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/talent.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/installment.json","pointer":"/properties/derivative_of/properties/installment_id","kind":"string","property":"installment_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/inventory-list-application.json","pointer":"/oneOf/0/properties/list_id","kind":"string","property":"list_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/inventory-list-application.json","pointer":"/oneOf/1/properties/list_id","kind":"string","property":"list_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/job-item.json","pointer":"/properties/job_id","kind":"string","property":"job_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/job-item.json","pointer":"/properties/title","kind":"string","property":"title","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/job-item.json","pointer":"/properties/company_name","kind":"string","property":"company_name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/job-item.json","pointer":"/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/job-item.json","pointer":"/properties/location","kind":"string","property":"location","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2048,"tier":"string-url","rationale":"URL-shaped value; 2,048 is the repository default and the common browser limit.","action":"tighten in 4.0"}, + {"file":"core/job-item.json","pointer":"/properties/job_functions","kind":"array","property":"job_functions","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/job-item.json","pointer":"/properties/job_functions/items","kind":"string","property":"job_functions","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/job-item.json","pointer":"/properties/industries","kind":"array","property":"industries","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/job-item.json","pointer":"/properties/industries/items","kind":"string","property":"industries","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/job-item.json","pointer":"/properties/tags","kind":"array","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/job-item.json","pointer":"/properties/tags/items","kind":"string","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/job-item.json","pointer":"/properties/assets","kind":"array","property":"assets","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/offering-asset-group.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/keyword-delivery-metrics.json","pointer":"/allOf/1/properties/keyword","kind":"string","property":"keyword","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/keyword-target.json","pointer":"/properties/keyword","kind":"string","property":"keyword","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/macro-bearing-url.json","pointer":"","kind":"string","property":"","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/macro-declaration.json","pointer":"/properties/declaration_id","kind":"string","property":"declaration_id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[A-Za-z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/macro-declaration.json","pointer":"/properties/token","kind":"string","property":"token","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"core/macro-declaration.json","pointer":"/properties/dialect_revision","kind":"string","property":"dialect_revision","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/macro-declaration.json","pointer":"/properties/dialect_semantic","kind":"string","property":"dialect_semantic","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/macro-resolution-capability.json","pointer":"/properties/dialect_revision","kind":"string","property":"dialect_revision","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/macro-resolution-capability.json","pointer":"/properties/dialect_semantic","kind":"string","property":"dialect_semantic","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/macro-resolution-capability.json","pointer":"/properties/supported_contexts","kind":"array","property":"supported_contexts","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/macro-resolution-capability.json","pointer":"/properties/supported_encodings","kind":"array","property":"supported_encodings","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/macro-encoding.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/macro-resolution-result.json","pointer":"/properties/declaration_id","kind":"string","property":"declaration_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/macro-resolution-result.json","pointer":"/properties/asset_path","kind":"string","property":"asset_path","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^/","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/macro-resolution-result.json","pointer":"/properties/token","kind":"string","property":"token","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"core/macro-resolution-result.json","pointer":"/properties/dialect_revision","kind":"string","property":"dialect_revision","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/macro-resolution-result.json","pointer":"/properties/dialect_semantic","kind":"string","property":"dialect_semantic","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/macro-resolution-result.json","pointer":"/properties/matched_encodings","kind":"array","property":"matched_encodings","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/macro-encoding.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/macro-resolution-result.json","pointer":"/properties/message","kind":"string","property":"message","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/macro-translation-target.json","pointer":"/properties/token","kind":"string","property":"token","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"core/macro-translation-target.json","pointer":"/properties/dialect_revision","kind":"string","property":"dialect_revision","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/macro-translation-target.json","pointer":"/properties/dialect_semantic","kind":"string","property":"dialect_semantic","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/match-key.json","pointer":"/properties/uses","kind":"array","property":"uses","side":"both","stability":"experimental","added_in_3_3":true,"in_last_stable":"no","items":"$ref /schemas/enums/match-key-use.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"core/match-key.json","pointer":"/properties/property_types","kind":"array","property":"property_types","side":"both","stability":"experimental","added_in_3_3":true,"in_last_stable":"no","items":"$ref /schemas/enums/property-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (10 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"core/material-deadline.json","pointer":"/properties/stage","kind":"string","property":"stage","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/material-deadline.json","pointer":"/properties/label","kind":"string","property":"label","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/mcp-webhook-payload.json","pointer":"/properties/operation_id","kind":"string","property":"operation_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/mcp-webhook-payload.json","pointer":"/properties/context_id","kind":"string","property":"context_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/measurement-readiness.json","pointer":"/properties/required_event_types","kind":"array","property":"required_event_types","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/event-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (31 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/measurement-readiness.json","pointer":"/properties/missing_event_types","kind":"array","property":"missing_event_types","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/event-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (31 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/measurement-readiness.json","pointer":"/properties/issues","kind":"array","property":"issues","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/diagnostic-issue.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"core/measurement-readiness.json","pointer":"/properties/notes","kind":"string","property":"notes","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/measurement-terms.json","pointer":"/properties/billing_measurement/properties/counting_mechanisms","kind":"array","property":"counting_mechanisms","side":"both","stability":"experimental","added_in_3_3":true,"in_last_stable":"no","items":"$ref /schemas/enums/collection-mechanism.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"withdrawn (#8501)"}, + {"file":"core/measurement-terms.json","pointer":"/properties/billing_measurement/properties/measurement_window","kind":"string","property":"measurement_window","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/measurement-terms.json","pointer":"/properties/makegood_policy/properties/available_remedies","kind":"array","property":"available_remedies","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/makegood-remedy.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/media-buy-available-action.json","pointer":"/properties/applicable_package_ids","kind":"array","property":"applicable_package_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/applicable-package-id.json","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/media-buy-change-term-id.json","pointer":"","kind":"string","property":"","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[A-Za-z0-9_.:-]+$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"core/media-buy-frequency-cap-capability.json","pointer":"/allOf/1/properties/supported_control_modes","kind":"array","property":"supported_control_modes","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/media-buy-frequency-cap-control-mode.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (1 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/media-buy-frequency-cap-requirement.json","pointer":"/allOf/1/properties/supported_control_modes","kind":"array","property":"supported_control_modes","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/media-buy-frequency-cap-control-mode.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (1 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/media-buy-frequency-cap-support.json","pointer":"/allOf/1/properties/supported_control_modes","kind":"array","property":"supported_control_modes","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/media-buy-frequency-cap-control-mode.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (1 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/media-buy-legacy-terms-ref.json","pointer":"","kind":"string","property":"","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/media-buy.json","pointer":"/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/media-buy.json","pointer":"/properties/impairments","kind":"array","property":"impairments","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/impairment.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/media-buy.json","pointer":"/properties/rejection_reason","kind":"string","property":"rejection_reason","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/media-buy.json","pointer":"/properties/budget_cap_timezone","kind":"string","property":"budget_cap_timezone","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"core/media-buy.json","pointer":"/properties/packages","kind":"array","property":"packages","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/package.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/negative-keyword.json","pointer":"/properties/keyword","kind":"string","property":"keyword","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/notification-config.json","pointer":"/properties/event_types","kind":"array","property":"event_types","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (24 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/notification-config.json","pointer":"/properties/authentication/properties/credentials","kind":"string","property":"credentials","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"core/offering-asset-group.json","pointer":"/properties/asset_group_id","kind":"string","property":"asset_group_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/offering-asset-group.json","pointer":"/properties/items","kind":"array","property":"items","side":"other","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/offering.json","pointer":"/properties/offering_id","kind":"string","property":"offering_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/offering.json","pointer":"/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/offering.json","pointer":"/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/offering.json","pointer":"/properties/tagline","kind":"string","property":"tagline","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"One-line marketing text.","action":"tighten in 4.0"}, + {"file":"core/offering.json","pointer":"/properties/assets","kind":"array","property":"assets","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/offering-asset-group.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/offering.json","pointer":"/properties/geo_targets/properties/countries","kind":"array","property":"countries","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/offering.json","pointer":"/properties/geo_targets/properties/regions","kind":"array","property":"regions","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-enum","rationale":"ISO 3166-2 subdivision codes (about 5,000): 1,000 lets a list name every state or province of several countries.","action":"tighten in 4.0"}, + {"file":"core/offering.json","pointer":"/properties/geo_targets/properties/metros","kind":"array","property":"metros","side":"other","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/offering.json","pointer":"/properties/geo_targets/properties/metros/items/properties/values","kind":"array","property":"values","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/offering.json","pointer":"/properties/geo_targets/properties/metros/items/properties/values/items","kind":"string","property":"values","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/offering.json","pointer":"/properties/geo_targets/properties/postal_areas","kind":"array","property":"postal_areas","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/postal-area.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/offering.json","pointer":"/properties/keywords","kind":"array","property":"keywords","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/offering.json","pointer":"/properties/keywords/items","kind":"string","property":"keywords","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/offering.json","pointer":"/properties/categories","kind":"array","property":"categories","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/offering.json","pointer":"/properties/categories/items","kind":"string","property":"categories","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/operator-identity.json","pointer":"/properties/operator","kind":"string","property":"operator","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/optimization-goal.json","pointer":"/oneOf/1/properties/event_sources","kind":"array","property":"event_sources","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/optimization-goal.json","pointer":"/oneOf/1/properties/event_sources/items/properties/event_source_id","kind":"string","property":"event_source_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/optimization-goal.json","pointer":"/oneOf/1/properties/event_sources/items/properties/custom_event_name","kind":"string","property":"custom_event_name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/optimization-goal.json","pointer":"/oneOf/1/properties/event_sources/items/properties/value_field","kind":"string","property":"value_field","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/outcome-measurement.json","pointer":"/properties/type","kind":"string","property":"type","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/outcome-measurement.json","pointer":"/properties/attribution","kind":"string","property":"attribution","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/outcome-measurement.json","pointer":"/properties/reporting","kind":"string","property":"reporting","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/overlay.json","pointer":"/properties/id","kind":"string","property":"id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/overlay.json","pointer":"/properties/description","kind":"string","property":"description","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/package-format-snapshot.json","pointer":"/properties/product_id","kind":"string","property":"product_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/package-format-snapshot.json","pointer":"/properties/placement_refs","kind":"array","property":"placement_refs","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/package-signal-targeting-group.json","pointer":"/properties/signals","kind":"array","property":"signals","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/package-signal-targeting.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/package-signal-targeting-groups.json","pointer":"/properties/groups","kind":"array","property":"groups","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/package-signal-targeting-group.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/package-signal-targeting.json","pointer":"/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/package-signal-targeting.json","pointer":"/properties/signal_agent_segment_id","kind":"string","property":"signal_agent_segment_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/package.json","pointer":"/properties/package_id","kind":"string","property":"package_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/package.json","pointer":"/properties/product_id","kind":"string","property":"product_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/package.json","pointer":"/properties/audience_evidence_selections","kind":"array","property":"audience_evidence_selections","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/audience-evidence-selection.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/package.json","pointer":"/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/package.json","pointer":"/properties/catalogs","kind":"array","property":"catalogs","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/catalog.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/package.json","pointer":"/properties/format_ids","kind":"array","property":"format_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/package.json","pointer":"/properties/format_option_refs","kind":"array","property":"format_option_refs","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-option-ref.json","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/package.json","pointer":"/properties/performance_standards","kind":"array","property":"performance_standards","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/performance-standard.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/package.json","pointer":"/properties/committed_metrics","kind":"array","property":"committed_metrics","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/committed-metric.json","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/package.json","pointer":"/properties/creative_assignments","kind":"array","property":"creative_assignments","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/creative-assignment.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/package.json","pointer":"/properties/formats_to_provide","kind":"array","property":"formats_to_provide","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/package-format-snapshot.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/package.json","pointer":"/properties/formats_pending","kind":"array","property":"formats_pending","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/package-format-snapshot.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/package.json","pointer":"/properties/format_ids_to_provide","kind":"array","property":"format_ids_to_provide","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/package.json","pointer":"/properties/format_ids_pending","kind":"array","property":"format_ids_pending","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/package.json","pointer":"/properties/optimization_goals","kind":"array","property":"optimization_goals","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/optimization-goal.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/pagination-request.json","pointer":"/properties/cursor","kind":"string","property":"cursor","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"core/pagination-response.json","pointer":"/properties/cursor","kind":"string","property":"cursor","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"core/performance-feedback.json","pointer":"/properties/feedback_id","kind":"string","property":"feedback_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/performance-feedback.json","pointer":"/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/performance-feedback.json","pointer":"/properties/package_id","kind":"string","property":"package_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/performance-feedback.json","pointer":"/properties/creative_id","kind":"string","property":"creative_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/placement-definition.json","pointer":"/properties/placement_id","kind":"string","property":"placement_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/placement-definition.json","pointer":"/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/placement-definition.json","pointer":"/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/placement-definition.json","pointer":"/properties/tags","kind":"array","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/placement-definition.json","pointer":"/properties/tags/items","kind":"string","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/placement-definition.json","pointer":"/properties/property_ids","kind":"array","property":"property_ids","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/property-id.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"core/placement-definition.json","pointer":"/properties/property_tags","kind":"array","property":"property_tags","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/property-tag.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"core/placement-definition.json","pointer":"/properties/collection_ids","kind":"array","property":"collection_ids","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/placement-definition.json","pointer":"/properties/collection_ids/items","kind":"string","property":"collection_ids","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/placement-definition.json","pointer":"/properties/channels","kind":"array","property":"channels","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/channels.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (20 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/placement-definition.json","pointer":"/properties/format_options","kind":"array","property":"format_options","side":"other","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/placement-definition.json","pointer":"/properties/format_options/items/anyOf/0/properties/format_option_id","kind":"string","property":"format_option_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/placement-definition.json","pointer":"/properties/video_placement_types","kind":"array","property":"video_placement_types","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/video-placement-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/placement-definition.json","pointer":"/properties/audio_distribution_types","kind":"array","property":"audio_distribution_types","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/audio-distribution-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/placement-definition.json","pointer":"/properties/sponsored_placement_types","kind":"array","property":"sponsored_placement_types","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/sponsored-placement-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/placement-definition.json","pointer":"/properties/social_placement_surfaces","kind":"array","property":"social_placement_surfaces","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/social-placement-surface.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/placement-definition.json","pointer":"/properties/identifiers","kind":"array","property":"identifiers","side":"other","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/placement-definition.json","pointer":"/properties/identifiers/items/properties/value","kind":"string","property":"value","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"core/placement-delivery-metrics.json","pointer":"/allOf/1/properties/placement_name","kind":"string","property":"placement_name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/placement-delivery-metrics.json","pointer":"/allOf/1/properties/placement_id","kind":"string","property":"placement_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/placement-delivery-metrics.json","pointer":"/allOf/1/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/placement-identity.json","pointer":"/oneOf/0/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/placement-identity.json","pointer":"/oneOf/0/properties/placement_id","kind":"string","property":"placement_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/placement-identity.json","pointer":"/oneOf/1/properties/placement_id","kind":"string","property":"placement_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/placement-property-delivery-metrics.json","pointer":"/allOf/1/properties/placement_id","kind":"string","property":"placement_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/placement-property-delivery-metrics.json","pointer":"/allOf/1/properties/placement_name","kind":"string","property":"placement_name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/placement-property-delivery-metrics.json","pointer":"/allOf/1/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/placement-property-delivery-metrics.json","pointer":"/allOf/1/properties/property_name","kind":"string","property":"property_name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/placement-ref.json","pointer":"/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/placement-ref.json","pointer":"/properties/placement_id","kind":"string","property":"placement_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/placement-selection.json","pointer":"/oneOf/0/properties/placement_refs","kind":"array","property":"placement_refs","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/placement.json","pointer":"/properties/placement_id","kind":"string","property":"placement_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/placement.json","pointer":"/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/placement.json","pointer":"/properties/name","kind":"string","property":"name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/placement.json","pointer":"/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/placement.json","pointer":"/properties/tags","kind":"array","property":"tags","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/placement.json","pointer":"/properties/tags/items","kind":"string","property":"tags","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/placement.json","pointer":"/properties/format_ids","kind":"array","property":"format_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/placement.json","pointer":"/properties/format_options","kind":"array","property":"format_options","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/product-format-declaration.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/placement.json","pointer":"/properties/video_placement_types","kind":"array","property":"video_placement_types","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/video-placement-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/placement.json","pointer":"/properties/audio_distribution_types","kind":"array","property":"audio_distribution_types","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/audio-distribution-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/placement.json","pointer":"/properties/sponsored_placement_types","kind":"array","property":"sponsored_placement_types","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/sponsored-placement-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/placement.json","pointer":"/properties/social_placement_surfaces","kind":"array","property":"social_placement_surfaces","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/social-placement-surface.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/placement.json","pointer":"/properties/identifiers","kind":"array","property":"identifiers","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/placement.json","pointer":"/properties/identifiers/items/properties/value","kind":"string","property":"value","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"core/planned-delivery.json","pointer":"/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/planned-delivery.json","pointer":"/properties/geo/properties/countries","kind":"array","property":"countries","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/planned-delivery.json","pointer":"/properties/geo/properties/countries/items","kind":"string","property":"countries","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/planned-delivery.json","pointer":"/properties/geo/properties/regions","kind":"array","property":"regions","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-enum","rationale":"ISO 3166-2 subdivision codes (about 5,000): 1,000 lets a list name every state or province of several countries.","action":"tighten in 4.0"}, + {"file":"core/planned-delivery.json","pointer":"/properties/geo/properties/regions/items","kind":"string","property":"regions","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/planned-delivery.json","pointer":"/properties/channels","kind":"array","property":"channels","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/channels.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (20 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/planned-delivery.json","pointer":"/properties/audience_summary","kind":"string","property":"audience_summary","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/planned-delivery.json","pointer":"/properties/audience_targeting","kind":"array","property":"audience_targeting","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/audience-selector.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/planned-delivery.json","pointer":"/properties/budget_cap_timezone","kind":"string","property":"budget_cap_timezone","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"core/planned-delivery.json","pointer":"/properties/enforced_policies","kind":"array","property":"enforced_policies","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/planned-delivery.json","pointer":"/properties/enforced_policies/items","kind":"string","property":"enforced_policies","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/postal-area-support.json","pointer":"/additionalProperties","kind":"array","property":"additionalProperties","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/postal-area-support.json","pointer":"/properties/US","kind":"array","property":"US","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/postal-area-support.json","pointer":"/properties/GB","kind":"array","property":"GB","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/postal-area-support.json","pointer":"/properties/CA","kind":"array","property":"CA","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/postal-area-support.json","pointer":"/properties/DE","kind":"array","property":"DE","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (1 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/postal-area-support.json","pointer":"/properties/CH","kind":"array","property":"CH","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (1 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/postal-area-support.json","pointer":"/properties/AT","kind":"array","property":"AT","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (1 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/postal-area-support.json","pointer":"/properties/FR","kind":"array","property":"FR","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (1 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/postal-area-support.json","pointer":"/properties/AU","kind":"array","property":"AU","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (1 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/postal-area-support.json","pointer":"/properties/BR","kind":"array","property":"BR","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (1 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/postal-area-support.json","pointer":"/properties/IN","kind":"array","property":"IN","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (1 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/postal-area-support.json","pointer":"/properties/ZA","kind":"array","property":"ZA","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (1 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/postal-area.json","pointer":"/anyOf/0/properties/values","kind":"array","property":"values","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/postal-area.json","pointer":"/anyOf/0/properties/values/items","kind":"string","property":"values","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/postal-area.json","pointer":"/anyOf/1/properties/values","kind":"array","property":"values","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/postal-area.json","pointer":"/anyOf/1/properties/values/items","kind":"string","property":"values","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/preview-provider.json","pointer":"/properties/routes","kind":"array","property":"routes","side":"other","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/preview-provider.json","pointer":"/properties/routes/items/properties/format_option_id","kind":"string","property":"format_option_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/preview-provider.json","pointer":"/properties/routes/items/properties/capability_id","kind":"string","property":"capability_id","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/preview-renderer-metadata.json","pointer":"/properties/renderer_id","kind":"string","property":"renderer_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/preview-renderer-metadata.json","pointer":"/properties/version","kind":"string","property":"version","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/preview-renderer-metadata.json","pointer":"/properties/export","kind":"string","property":"export","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/product-allocation.json","pointer":"/properties/product_id","kind":"string","property":"product_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/product-allocation.json","pointer":"/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/product-allocation.json","pointer":"/properties/rationale","kind":"string","property":"rationale","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/product-allocation.json","pointer":"/properties/tags","kind":"array","property":"tags","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/product-allocation.json","pointer":"/properties/tags/items","kind":"string","property":"tags","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/product-allocation.json","pointer":"/properties/daypart_targets","kind":"array","property":"daypart_targets","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/daypart-target.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product-allowed-action.json","pointer":"/properties/modes","kind":"array","property":"modes","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/media-buy-action-mode.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-allowed-action.json","pointer":"/properties/allowed_statuses","kind":"array","property":"allowed_statuses","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/media-buy-status.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-allowed-action.json","pointer":"/properties/terms_ref","kind":"string","property":"terms_ref","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/product-audience-evidence-requirements.json","pointer":"/properties/accepted_methodologies","kind":"array","property":"accepted_methodologies","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/audience-evidence-methodology.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-audience-evidence-requirements.json","pointer":"/properties/excluded_methodologies","kind":"array","property":"excluded_methodologies","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/audience-evidence-methodology.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-audience-evidence-requirements.json","pointer":"/properties/accepted_evidence_types","kind":"array","property":"accepted_evidence_types","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-audience-evidence-requirements.json","pointer":"/properties/accepted_providers","kind":"array","property":"accepted_providers","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/brand-key.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product-audience-evidence-requirements.json","pointer":"/properties/excluded_providers","kind":"array","property":"excluded_providers","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/brand-key.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product-audience-evidence-requirements.json","pointer":"/properties/accepted_subject_types","kind":"array","property":"accepted_subject_types","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/audience-subject-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-audience-evidence-requirements.json","pointer":"/properties/accepted_resolution_methods","kind":"array","property":"accepted_resolution_methods","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/audience-resolution-method.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-audience-evidence-requirements.json","pointer":"/properties/accepted_attestation_issuers","kind":"array","property":"accepted_attestation_issuers","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product-audience-evidence-requirements.json","pointer":"/properties/accepted_attestation_claim_types","kind":"array","property":"accepted_attestation_claim_types","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/product-card-reference-asset.json","pointer":"/properties/role_label","kind":"string","property":"role_label","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/product-card-reference-asset.json","pointer":"/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/product-execution-requirement.json","pointer":"/oneOf/0/properties/event_types","kind":"array","property":"event_types","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/event-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (31 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-execution-requirement.json","pointer":"/oneOf/1/properties/catalog_types","kind":"array","property":"catalog_types","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/catalog-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (13 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/pricing_structures","kind":"array","property":"pricing_structures","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/pricing-structure.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/pricing_currencies","kind":"array","property":"pricing_currencies","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/format_ids","kind":"array","property":"format_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/format_kinds","kind":"array","property":"format_kinds","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-format-kind.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (16 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/format_option_refs","kind":"array","property":"format_option_refs","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-option-ref.json","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/countries","kind":"array","property":"countries","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/regions","kind":"array","property":"regions","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-enum","rationale":"ISO 3166-2 subdivision codes (about 5,000): 1,000 lets a list name every state or province of several countries.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/regions/items","kind":"string","property":"regions","side":"request","stability":"stable","in_last_stable":"yes","pattern":"^[A-Z]{2}-[A-Z0-9]+$","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/metros","kind":"array","property":"metros","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/metros/items/properties/code","kind":"string","property":"code","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/channels","kind":"array","property":"channels","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/channels.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (20 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/video_placement_types","kind":"array","property":"video_placement_types","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/video-placement-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/audio_distribution_types","kind":"array","property":"audio_distribution_types","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/audio-distribution-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/sponsored_placement_types","kind":"array","property":"sponsored_placement_types","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/sponsored-placement-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/social_placement_surfaces","kind":"array","property":"social_placement_surfaces","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/social-placement-surface.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/required_axe_integrations","kind":"array","property":"required_axe_integrations","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/trusted_match/properties/providers","kind":"array","property":"providers","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/trusted_match/properties/response_types","kind":"array","property":"response_types","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/response-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/required_geo_targeting","kind":"array","property":"required_geo_targeting","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/required_geo_targeting/items/properties/system","kind":"string","property":"system","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/signal_targeting","kind":"array","property":"signal_targeting","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/postal_areas","kind":"array","property":"postal_areas","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/postal-area.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/geo_proximity","kind":"array","property":"geo_proximity","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/geo_proximity/items/properties/label","kind":"string","property":"label","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/geo_proximity/items/properties/geometry/properties/coordinates","kind":"array","property":"coordinates","side":"request","stability":"stable","in_last_stable":"yes","items":"untyped","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/required_performance_standards","kind":"array","property":"required_performance_standards","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/performance-standard.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/required_metrics","kind":"array","property":"required_metrics","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/available-metric.json","proposed_limit":51,"tier":"array-enum","rationale":"Enum-valued items (51 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/required_vendor_metrics","kind":"array","property":"required_vendor_metrics","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/keywords","kind":"array","property":"keywords","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/product-filters.json","pointer":"/properties/keywords/items/properties/keyword","kind":"string","property":"keyword","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/product-format-declaration.json","pointer":"/properties/format_option_id","kind":"string","property":"format_option_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/product-format-declaration.json","pointer":"/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/product-format-declaration.json","pointer":"/properties/macro_resolution_capabilities","kind":"array","property":"macro_resolution_capabilities","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/macro-resolution-capability.json","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/product-format-declaration.json","pointer":"/properties/display_name","kind":"string","property":"display_name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/product-format-declaration.json","pointer":"/properties/applies_to_channels","kind":"array","property":"applies_to_channels","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/channels.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (20 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-format-declaration.json","pointer":"/properties/format_shape","kind":"string","property":"format_shape","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/product-format-declaration.json","pointer":"/properties/v1_format_ref","kind":"array","property":"v1_format_ref","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product-offer-filters.json","pointer":"/properties/pricing_structures","kind":"array","property":"pricing_structures","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/pricing-structure.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-offer-filters.json","pointer":"/properties/pricing_currencies","kind":"array","property":"pricing_currencies","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/product-offer-filters.json","pointer":"/properties/format_kinds","kind":"array","property":"format_kinds","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-format-kind.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (16 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-offer-filters.json","pointer":"/properties/format_option_refs","kind":"array","property":"format_option_refs","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-option-ref.json","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"core/product-offer-filters.json","pointer":"/properties/countries","kind":"array","property":"countries","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/product-offer-filters.json","pointer":"/properties/regions","kind":"array","property":"regions","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-enum","rationale":"ISO 3166-2 subdivision codes (about 5,000): 1,000 lets a list name every state or province of several countries.","action":"tighten in 4.0"}, + {"file":"core/product-offer-filters.json","pointer":"/properties/metros","kind":"array","property":"metros","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/product-offer-filters.json","pointer":"/properties/metros/items/properties/code","kind":"string","property":"code","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/product-offer-filters.json","pointer":"/properties/postal_areas","kind":"array","property":"postal_areas","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/postal-area.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/product-offer-filters.json","pointer":"/properties/channels","kind":"array","property":"channels","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/channels.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (20 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-offer-filters.json","pointer":"/properties/video_placement_types","kind":"array","property":"video_placement_types","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/video-placement-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-offer-filters.json","pointer":"/properties/audio_distribution_types","kind":"array","property":"audio_distribution_types","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/audio-distribution-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-offer-filters.json","pointer":"/properties/sponsored_placement_types","kind":"array","property":"sponsored_placement_types","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/sponsored-placement-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-offer-filters.json","pointer":"/properties/social_placement_surfaces","kind":"array","property":"social_placement_surfaces","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/social-placement-surface.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-offer-filters.json","pointer":"/properties/trusted_match/properties/providers","kind":"array","property":"providers","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/product-offer-filters.json","pointer":"/properties/trusted_match/properties/response_types","kind":"array","property":"response_types","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/response-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-offer-filters.json","pointer":"/properties/required_performance_standards","kind":"array","property":"required_performance_standards","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/product-offer-filters.json","pointer":"/properties/required_metrics","kind":"array","property":"required_metrics","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/available-metric.json","proposed_limit":51,"tier":"array-enum","rationale":"Enum-valued items (51 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-offer-filters.json","pointer":"/properties/required_vendor_metrics","kind":"array","property":"required_vendor_metrics","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/product-signal-targeting-option.json","pointer":"/properties/signal_agent_segment_id","kind":"string","property":"signal_agent_segment_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/product-signal-targeting-option.json","pointer":"/properties/allowed_targeting_modes","kind":"array","property":"allowed_targeting_modes","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product-signal-targeting-option.json","pointer":"/properties/selection_group","kind":"string","property":"selection_group","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/product-signal-targeting-option.json","pointer":"/properties/pricing_options","kind":"array","property":"pricing_options","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/vendor-pricing-option.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product-targeting-resolution.json","pointer":"/properties/modifications","kind":"array","property":"modifications","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/targeting-modification.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/product_id","kind":"string","property":"product_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/name","kind":"string","property":"name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/publisher_properties","kind":"array","property":"publisher_properties","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"core/product.json","pointer":"/properties/channels","kind":"array","property":"channels","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/channels.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (20 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/format_ids","kind":"array","property":"format_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/format_options","kind":"array","property":"format_options","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/product-format-declaration.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/placements","kind":"array","property":"placements","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/placement.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/video_placement_types","kind":"array","property":"video_placement_types","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/video-placement-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/audio_distribution_types","kind":"array","property":"audio_distribution_types","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/audio-distribution-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/sponsored_placement_types","kind":"array","property":"sponsored_placement_types","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/sponsored-placement-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/social_placement_surfaces","kind":"array","property":"social_placement_surfaces","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/social-placement-surface.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/pricing_options","kind":"array","property":"pricing_options","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/pricing-option.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/delivery_measurement/properties/vendors","kind":"array","property":"vendors","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/brand-ref.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/delivery_measurement/properties/provider","kind":"string","property":"provider","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/delivery_measurement/properties/notes","kind":"string","property":"notes","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/performance_standards","kind":"array","property":"performance_standards","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/performance-standard.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/allowed_actions","kind":"array","property":"allowed_actions","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/product-allowed-action.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/data_provider_signals","kind":"array","property":"data_provider_signals","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/data-provider-signal-selector.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/included_signals","kind":"array","property":"included_signals","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/signal-listing.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/signal_targeting_options","kind":"array","property":"signal_targeting_options","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/product-signal-targeting-option.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/execution_requirements","kind":"array","property":"execution_requirements","side":"both","stability":"stable","in_last_stable":"yes","marker_conflict":true,"items":"$ref /schemas/core/product-execution-requirement.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/audience_evidence","kind":"array","property":"audience_evidence","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/audience-evidence.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/audience_evidence_selections","kind":"array","property":"audience_evidence_selections","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/audience-evidence-selection.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/catalog_types","kind":"array","property":"catalog_types","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/catalog-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (13 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/metric_optimization/properties/supported_metrics","kind":"array","property":"supported_metrics","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (12 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/metric_optimization/properties/supported_reach_units","kind":"array","property":"supported_reach_units","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/reach-unit.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/metric_optimization/properties/supported_view_durations","kind":"array","property":"supported_view_durations","side":"both","stability":"stable","in_last_stable":"yes","items":"number","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/metric_optimization/properties/supported_viewability_standards","kind":"array","property":"supported_viewability_standards","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/viewability-standard.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/metric_optimization/properties/supported_targets","kind":"array","property":"supported_targets","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/conversion_tracking/properties/action_sources","kind":"array","property":"action_sources","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/action-source.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (9 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/conversion_tracking/properties/supported_targets","kind":"array","property":"supported_targets","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/catalog_match/properties/matched_gtins","kind":"array","property":"matched_gtins","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/catalog_match/properties/matched_ids","kind":"array","property":"matched_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/catalog_match/properties/matched_ids/items","kind":"string","property":"matched_ids","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/brief_relevance","kind":"string","property":"brief_relevance","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/product_card_detailed/properties/carousel_images","kind":"array","property":"carousel_images","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/assets/image-asset.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/product_card_detailed/properties/title","kind":"string","property":"title","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/product_card_detailed/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/product_card_detailed/properties/specifications","kind":"array","property":"specifications","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/product_card_detailed/properties/price_label","kind":"string","property":"price_label","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/product_card_detailed/properties/cta_label","kind":"string","property":"cta_label","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/product_card_detailed/properties/reference_assets","kind":"array","property":"reference_assets","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/product-card-reference-asset.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/collections","kind":"array","property":"collections","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"core/product.json","pointer":"/properties/list_applications","kind":"array","property":"list_applications","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/inventory-list-application.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/installments","kind":"array","property":"installments","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/installment.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/enforced_policies","kind":"array","property":"enforced_policies","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/enforced_policies/items","kind":"string","property":"enforced_policies","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/trusted_match/properties/response_types","kind":"array","property":"response_types","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/response-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/trusted_match/properties/providers","kind":"array","property":"providers","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/trusted_match/properties/providers/items/properties/countries","kind":"array","property":"countries","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/product.json","pointer":"/properties/trusted_match/properties/providers/items/properties/uid_types","kind":"array","property":"uid_types","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/uid-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (11 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/property-delivery-metrics.json","pointer":"/allOf/1/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/property-delivery-metrics.json","pointer":"/allOf/1/properties/property_name","kind":"string","property":"property_name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/property-id.json","pointer":"","kind":"string","property":"","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9_]+$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"core/property-list-ref.json","pointer":"/properties/list_id","kind":"string","property":"list_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/property-list-ref.json","pointer":"/properties/auth_token","kind":"string","property":"auth_token","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"core/property-ref.json","pointer":"/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/property-tag.json","pointer":"","kind":"string","property":"","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9_]+$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"core/property.json","pointer":"/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/property.json","pointer":"/properties/identifiers","kind":"array","property":"identifiers","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/property.json","pointer":"/properties/identifiers/items/properties/value","kind":"string","property":"value","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"core/property.json","pointer":"/properties/tags","kind":"array","property":"tags","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/property-tag.json","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/property.json","pointer":"/properties/supported_channels","kind":"array","property":"supported_channels","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/channels.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (20 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/property.json","pointer":"/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/proposal.json","pointer":"/properties/allocations","kind":"array","property":"allocations","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/product-allocation.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/proposal.json","pointer":"/properties/total_budget_guidance/properties/currency","kind":"string","property":"currency","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"core/protocol-envelope.json","pointer":"/properties/context_id","kind":"string","property":"context_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/provenance.json","pointer":"/properties/ai_tool/properties/name","kind":"string","property":"name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/provenance.json","pointer":"/properties/ai_tool/properties/version","kind":"string","property":"version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/provenance.json","pointer":"/properties/ai_tool/properties/provider","kind":"string","property":"provider","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/provenance.json","pointer":"/properties/embedded_provenance","kind":"array","property":"embedded_provenance","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/provenance.json","pointer":"/properties/embedded_provenance/items/properties/standard","kind":"string","property":"standard","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/provenance.json","pointer":"/properties/embedded_provenance/items/properties/provider","kind":"string","property":"provider","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/provenance.json","pointer":"/properties/embedded_provenance/items/properties/verify_agent/properties/feature_id","kind":"string","property":"feature_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/provenance.json","pointer":"/properties/watermarks","kind":"array","property":"watermarks","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/provenance.json","pointer":"/properties/watermarks/items/properties/provider","kind":"string","property":"provider","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/provenance.json","pointer":"/properties/watermarks/items/properties/verify_agent/properties/feature_id","kind":"string","property":"feature_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/provenance.json","pointer":"/properties/disclosure/properties/jurisdictions","kind":"array","property":"jurisdictions","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/provenance.json","pointer":"/properties/disclosure/properties/jurisdictions/items/properties/country","kind":"string","property":"country","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"core/provenance.json","pointer":"/properties/disclosure/properties/jurisdictions/items/properties/region","kind":"string","property":"region","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/provenance.json","pointer":"/properties/disclosure/properties/jurisdictions/items/properties/regulation","kind":"string","property":"regulation","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/provenance.json","pointer":"/properties/disclosure/properties/jurisdictions/items/properties/label_text","kind":"string","property":"label_text","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/provenance.json","pointer":"/properties/disclosure/properties/jurisdictions/items/properties/render_guidance/properties/positions","kind":"array","property":"positions","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/disclosure-position.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (8 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/provenance.json","pointer":"/properties/verification","kind":"array","property":"verification","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/provenance.json","pointer":"/properties/verification/items/properties/verified_by","kind":"string","property":"verified_by","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/publisher-property-selector.json","pointer":"/oneOf/0/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/publisher-property-selector.json","pointer":"/oneOf/0/properties/publisher_domains","kind":"array","property":"publisher_domains","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"core/publisher-property-selector.json","pointer":"/oneOf/0/properties/publisher_domains/items","kind":"string","property":"publisher_domains","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/publisher-property-selector.json","pointer":"/oneOf/1/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/publisher-property-selector.json","pointer":"/oneOf/1/properties/property_ids","kind":"array","property":"property_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/property-id.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"core/publisher-property-selector.json","pointer":"/oneOf/2/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/publisher-property-selector.json","pointer":"/oneOf/2/properties/publisher_domains","kind":"array","property":"publisher_domains","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"core/publisher-property-selector.json","pointer":"/oneOf/2/properties/publisher_domains/items","kind":"string","property":"publisher_domains","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/publisher-property-selector.json","pointer":"/oneOf/2/properties/property_tags","kind":"array","property":"property_tags","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/property-tag.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"core/push-notification-config.json","pointer":"/properties/authentication/properties/credentials","kind":"string","property":"credentials","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"core/real-estate-item.json","pointer":"/properties/listing_id","kind":"string","property":"listing_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/real-estate-item.json","pointer":"/properties/title","kind":"string","property":"title","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/real-estate-item.json","pointer":"/properties/address/properties/street","kind":"string","property":"street","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":200,"tier":"string-id","rationale":"Matches street fields already bounded at 200.","action":"tighten in 4.0"}, + {"file":"core/real-estate-item.json","pointer":"/properties/address/properties/city","kind":"string","property":"city","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":100,"tier":"string-id","rationale":"City name.","action":"tighten in 4.0"}, + {"file":"core/real-estate-item.json","pointer":"/properties/address/properties/region","kind":"string","property":"region","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/real-estate-item.json","pointer":"/properties/address/properties/postal_code","kind":"string","property":"postal_code","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/real-estate-item.json","pointer":"/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/real-estate-item.json","pointer":"/properties/neighborhood","kind":"string","property":"neighborhood","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/real-estate-item.json","pointer":"/properties/tags","kind":"array","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/real-estate-item.json","pointer":"/properties/tags/items","kind":"string","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/real-estate-item.json","pointer":"/properties/assets","kind":"array","property":"assets","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/offering-asset-group.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/reference-asset.json","pointer":"/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/reference-renderer.json","pointer":"/properties/package","kind":"string","property":"package","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^(?:@[a-z0-9][a-z0-9._~-]*/)?[a-z0-9][a-z0-9._~-]*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/reference-renderer.json","pointer":"/properties/version","kind":"string","property":"version","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/reference-renderer.json","pointer":"/properties/export","kind":"string","property":"export","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/reference-renderer.json","pointer":"/properties/format_revision","kind":"string","property":"format_revision","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"core/reference-renderer.json","pointer":"/properties/provenance/properties/workflow_path","kind":"string","property":"workflow_path","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^\\.github/workflows/[A-Za-z0-9._/-]+\\.ya?ml$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/oneOf/2/properties/payload/properties/evidence","kind":"string","property":"evidence","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/oneOf/3/properties/payload/properties/reason","kind":"string","property":"reason","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/oneOf/7/properties/payload/properties/evidence","kind":"string","property":"evidence","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/oneOf/10/properties/payload/properties/removed_from_publishers","kind":"array","property":"removed_from_publishers","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref #/$defs/domain","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"core/registry-event.json","pointer":"/oneOf/13/properties/payload/properties/verified_specialisms","kind":"array","property":"verified_specialisms","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/oneOf/13/properties/payload/properties/verified_specialisms/items","kind":"string","property":"verified_specialisms","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/oneOf/13/properties/payload/properties/adcp_version","kind":"string","property":"adcp_version","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/oneOf/14/properties/payload/properties/reason","kind":"string","property":"reason","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/oneOf/14/properties/payload/properties/adcp_version","kind":"string","property":"adcp_version","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/oneOf/16/properties/payload/allOf/1/properties/agents_added","kind":"array","property":"agents_added","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/oneOf/16/properties/payload/allOf/1/properties/agents_removed","kind":"array","property":"agents_removed","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/properties/entity_id","kind":"string","property":"entity_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/properties/actor","kind":"string","property":"actor","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/domain","kind":"string","property":"domain","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/publisherAdagentsPayload/properties/agents_added","kind":"array","property":"agents_added","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/publisherAdagentsPayload/properties/agents_removed","kind":"array","property":"agents_removed","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/publisherAdagentsPayload/properties/discovery_method","kind":"string","property":"discovery_method","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/publisherAdagentsPayload/properties/manager_domain","kind":"string","property":"manager_domain","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/publisherAdagentsPayload/properties/source","kind":"string","property":"source","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/stringArray","kind":"array","property":"stringArray","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/stringArray/items","kind":"string","property":"stringArray","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/changedFields","kind":"array","property":"changedFields","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/changedFields/items","kind":"string","property":"changedFields","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/propertyPayload/properties/identifiers","kind":"array","property":"identifiers","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/identifier.json","proposed_limit":32,"tier":"array-small","rationale":"Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/collectionIdentifier/properties/value","kind":"string","property":"value","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/collectionPayload/properties/collection_id","kind":"string","property":"collection_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/collectionPayload/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/collectionPayload/properties/identifiers","kind":"array","property":"identifiers","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref #/$defs/collectionIdentifier","proposed_limit":32,"tier":"array-small","rationale":"Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/agentProfilePayload/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/agentProfilePayload/properties/markets","kind":"array","property":"markets","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/agentProfilePayload/properties/category_taxonomy","kind":"string","property":"category_taxonomy","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/agentProfilePayload/properties/format_ids","kind":"array","property":"format_ids","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/agentProfilePayload/properties/format_kinds","kind":"array","property":"format_kinds","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-format-kind.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (16 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/countries","kind":"array","property":"countries","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/authorizationPayload/properties/agent_url_canonical","kind":"string","property":"agent_url_canonical","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/authorizationPayload/properties/authorized_for","kind":"string","property":"authorized_for","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/authorizationPayload/properties/property_ids","kind":"array","property":"property_ids","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/property-id.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"core/registry-event.json","pointer":"/$defs/authorizationPayload/properties/property_tags","kind":"array","property":"property_tags","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/property-tag.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"core/registry-event.json","pointer":"/$defs/authorizationPayload/properties/properties","kind":"array","property":"properties","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/property.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"core/registry-event.json","pointer":"/$defs/authorizationPayload/properties/publisher_properties","kind":"array","property":"publisher_properties","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/publisher-property-selector.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"core/registry-event.json","pointer":"/$defs/authorizationPayload/properties/property_id_slug","kind":"string","property":"property_id_slug","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/authorizationPayload/properties/placement_ids","kind":"array","property":"placement_ids","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/authorizationPayload/properties/placement_ids/items","kind":"string","property":"placement_ids","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/authorizationPayload/properties/placement_tags","kind":"array","property":"placement_tags","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/authorizationPayload/properties/placement_tags/items","kind":"string","property":"placement_tags","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/authorizationPayload/properties/collections","kind":"array","property":"collections","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/collection-selector.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"core/registry-event.json","pointer":"/$defs/authorizationPayload/properties/signing_keys","kind":"array","property":"signing_keys","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/agent-signing-key.json","proposed_limit":32,"tier":"array-small","rationale":"Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/authorizationPayload/properties/created_by","kind":"string","property":"created_by","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/authorizationPayload/properties/override_reason","kind":"string","property":"override_reason","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/compliancePayload/properties/headline","kind":"string","property":"headline","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/compliancePayload/properties/storyboards","kind":"array","property":"storyboards","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/registry-event.json","pointer":"/$defs/compliancePayload/properties/storyboards/items/properties/storyboard_id","kind":"string","property":"storyboard_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/registry-feed-response.json","pointer":"/properties/events","kind":"array","property":"events","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/registry-event.json","proposed_limit":10000,"tier":"array-catalog","rationale":"Catalog-scale payload; matches the 10,000 ceiling already used for records and events.","action":"tighten in 4.0"}, + {"file":"core/reporting-capabilities.json","pointer":"/properties/available_reporting_frequencies","kind":"array","property":"available_reporting_frequencies","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/reporting-frequency.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/reporting-capabilities.json","pointer":"/properties/timezone","kind":"string","property":"timezone","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"core/reporting-capabilities.json","pointer":"/properties/reporting_delivery_offering_ids","kind":"array","property":"reporting_delivery_offering_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/reporting-delivery-offering-id.json","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/reporting-capabilities.json","pointer":"/properties/available_metrics","kind":"array","property":"available_metrics","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/available-metric.json","proposed_limit":51,"tier":"array-enum","rationale":"Enum-valued items (51 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/reporting-capabilities.json","pointer":"/properties/vendor_metrics","kind":"array","property":"vendor_metrics","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/reporting-capabilities.json","pointer":"/properties/windowed_pull_granularities","kind":"array","property":"windowed_pull_granularities","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/reporting-frequency.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/reporting-capabilities.json","pointer":"/properties/measurement_windows","kind":"array","property":"measurement_windows","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/measurement-window.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/reporting-delivery-capabilities.json","pointer":"/properties/configuration_tasks","kind":"array","property":"configuration_tasks","side":"response","stability":"experimental","added_in_3_3":true,"in_last_stable":"no","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"core/reporting-delivery-capabilities.json","pointer":"/properties/subscriptions/properties/dimensions","kind":"array","property":"dimensions","side":"response","stability":"experimental","added_in_3_3":true,"in_last_stable":"no","items":"$ref /schemas/enums/reporting-dimension.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"core/reporting-delivery-offering.json","pointer":"/properties/supported_finality","kind":"array","property":"supported_finality","side":"response","stability":"experimental","in_last_stable":"yes","items":"$ref /schemas/enums/reporting-finality.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"core/reporting-delivery-offering.json","pointer":"/properties/method/properties/destination_modes","kind":"array","property":"destination_modes","side":"response","stability":"experimental","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"core/reporting-subscription-coverage.json","pointer":"/properties/excluded/items/properties/package_ids","kind":"array","property":"package_ids","side":"response","stability":"experimental","added_in_3_3":true,"in_last_stable":"no","items":"$ref /schemas/core/reporting-coverage.json#/definitions/ReportingPackageId","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"deferred (SDK generation)"}, + {"file":"core/reporting-verification-profile-set.json","pointer":"","kind":"array","property":"","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/reporting-webhook.json","pointer":"/properties/token","kind":"string","property":"token","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"core/reporting-webhook.json","pointer":"/properties/authentication/properties/credentials","kind":"string","property":"credentials","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"core/reporting-webhook.json","pointer":"/properties/requested_metrics","kind":"array","property":"requested_metrics","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/available-metric.json","proposed_limit":51,"tier":"array-enum","rationale":"Enum-valued items (51 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/representation-destination.json","pointer":"/properties/product_id","kind":"string","property":"product_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/representation-destination.json","pointer":"/properties/placement_refs","kind":"array","property":"placement_refs","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/placement-ref.json","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"core/representation-rejection.json","pointer":"/properties/representation_id","kind":"string","property":"representation_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/representation-rejection.json","pointer":"/properties/message","kind":"string","property":"message","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/representation-selection.json","pointer":"/properties/creative_id","kind":"string","property":"creative_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/representation-selection.json","pointer":"/properties/selected_representation_id","kind":"string","property":"selected_representation_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/requirements/audio-asset-requirements.json","pointer":"/properties/formats","kind":"array","property":"formats","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/requirements/audio-asset-requirements.json","pointer":"/properties/sample_rates","kind":"array","property":"sample_rates","side":"response","stability":"stable","in_last_stable":"yes","items":"integer","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/requirements/audio-asset-requirements.json","pointer":"/properties/channels","kind":"array","property":"channels","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/requirements/catalog-field-binding.json","pointer":"/oneOf/2/properties/format_group_id","kind":"string","property":"format_group_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/requirements/catalog-field-binding.json","pointer":"/oneOf/2/properties/per_item_bindings","kind":"array","property":"per_item_bindings","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/requirements/catalog-field-binding.json","pointer":"/definitions/ScalarBinding/properties/asset_id","kind":"string","property":"asset_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/requirements/catalog-field-binding.json","pointer":"/definitions/ScalarBinding/properties/catalog_field","kind":"string","property":"catalog_field","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/requirements/catalog-field-binding.json","pointer":"/definitions/AssetPoolBinding/properties/asset_id","kind":"string","property":"asset_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/requirements/catalog-field-binding.json","pointer":"/definitions/AssetPoolBinding/properties/asset_group_id","kind":"string","property":"asset_group_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/requirements/catalog-requirements.json","pointer":"/properties/required_fields","kind":"array","property":"required_fields","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/requirements/catalog-requirements.json","pointer":"/properties/required_fields/items","kind":"string","property":"required_fields","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/requirements/catalog-requirements.json","pointer":"/properties/feed_formats","kind":"array","property":"feed_formats","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/feed-format.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (8 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/requirements/catalog-requirements.json","pointer":"/properties/offering_asset_constraints","kind":"array","property":"offering_asset_constraints","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/requirements/offering-asset-constraint.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/requirements/catalog-requirements.json","pointer":"/properties/field_bindings","kind":"array","property":"field_bindings","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/requirements/catalog-field-binding.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/requirements/html-asset-requirements.json","pointer":"/properties/allowed_external_domains","kind":"array","property":"allowed_external_domains","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/requirements/html-asset-requirements.json","pointer":"/properties/allowed_external_domains/items","kind":"string","property":"allowed_external_domains","side":"response","stability":"stable","in_last_stable":"yes","format":"hostname","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/requirements/image-asset-requirements.json","pointer":"/properties/pixel_ratios","kind":"array","property":"pixel_ratios","side":"response","stability":"stable","in_last_stable":"yes","items":"number","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/requirements/image-asset-requirements.json","pointer":"/properties/aspect_ratio","kind":"string","property":"aspect_ratio","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^\\d+(\\.\\d+)?:\\d+(\\.\\d+)?$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"core/requirements/image-asset-requirements.json","pointer":"/properties/formats","kind":"array","property":"formats","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (10 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/requirements/javascript-asset-requirements.json","pointer":"/properties/allowed_external_domains","kind":"array","property":"allowed_external_domains","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/requirements/javascript-asset-requirements.json","pointer":"/properties/allowed_external_domains/items","kind":"string","property":"allowed_external_domains","side":"response","stability":"stable","in_last_stable":"yes","format":"hostname","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/requirements/offering-asset-constraint.json","pointer":"/properties/asset_group_id","kind":"string","property":"asset_group_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/requirements/text-asset-requirements.json","pointer":"/properties/character_pattern","kind":"string","property":"character_pattern","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/requirements/text-asset-requirements.json","pointer":"/properties/prohibited_terms","kind":"array","property":"prohibited_terms","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/requirements/text-asset-requirements.json","pointer":"/properties/prohibited_terms/items","kind":"string","property":"prohibited_terms","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/requirements/text-asset-requirements.json","pointer":"/properties/allowed_values","kind":"array","property":"allowed_values","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/requirements/text-asset-requirements.json","pointer":"/properties/allowed_values/items","kind":"string","property":"allowed_values","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/requirements/url-asset-requirements.json","pointer":"/properties/protocols","kind":"array","property":"protocols","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/requirements/url-asset-requirements.json","pointer":"/properties/allowed_domains","kind":"array","property":"allowed_domains","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/requirements/url-asset-requirements.json","pointer":"/properties/allowed_domains/items","kind":"string","property":"allowed_domains","side":"response","stability":"stable","in_last_stable":"yes","format":"hostname","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/requirements/vast-asset-requirements.json","pointer":"/properties/vast_versions","kind":"array","property":"vast_versions","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/vast-version.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/requirements/video-asset-requirements.json","pointer":"/properties/aspect_ratio","kind":"string","property":"aspect_ratio","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^\\d+:\\d+$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"core/requirements/video-asset-requirements.json","pointer":"/properties/containers","kind":"array","property":"containers","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/requirements/video-asset-requirements.json","pointer":"/properties/codecs","kind":"array","property":"codecs","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/requirements/video-asset-requirements.json","pointer":"/properties/frame_rates","kind":"array","property":"frame_rates","side":"response","stability":"stable","in_last_stable":"yes","items":"number","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/requirements/video-asset-requirements.json","pointer":"/properties/audio_codecs","kind":"array","property":"audio_codecs","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (8 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/requirements/video-asset-requirements.json","pointer":"/properties/audio_sample_rates","kind":"array","property":"audio_sample_rates","side":"response","stability":"stable","in_last_stable":"yes","items":"integer","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/requirements/video-asset-requirements.json","pointer":"/properties/audio_channels","kind":"array","property":"audio_channels","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/audio-channel-layout.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/requirements/webhook-asset-requirements.json","pointer":"/properties/methods","kind":"array","property":"methods","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/response-payload-jws-envelope.json","pointer":"/properties/protected","kind":"string","property":"protected","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[A-Za-z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"core/response-payload-jws-envelope.json","pointer":"/properties/signature","kind":"string","property":"signature","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[A-Za-z0-9_-]+$","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"core/response-payload-jws-envelope.json","pointer":"/definitions/response_payload/properties/brand_domain","kind":"string","property":"brand_domain","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/response.json","pointer":"/properties/context_id","kind":"string","property":"context_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/rights-attestation-evaluation.json","pointer":"/properties/rights_id","kind":"string","property":"rights_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/rights-constraint.json","pointer":"/properties/rights_id","kind":"string","property":"rights_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/rights-constraint.json","pointer":"/properties/rights_agent/properties/id","kind":"string","property":"id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/rights-constraint.json","pointer":"/properties/uses","kind":"array","property":"uses","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/right-use.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (12 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/rights-constraint.json","pointer":"/properties/countries","kind":"array","property":"countries","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/rights-constraint.json","pointer":"/properties/excluded_countries","kind":"array","property":"excluded_countries","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/rights-constraint.json","pointer":"/properties/restrictions","kind":"array","property":"restrictions","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/rights-constraint.json","pointer":"/properties/restrictions/items","kind":"string","property":"restrictions","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/rights-constraint.json","pointer":"/properties/disclosure/properties/text","kind":"string","property":"text","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/signal-coverage-forecast.json","pointer":"/properties/points","kind":"array","property":"points","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-coverage-forecast.json","pointer":"/properties/scope/properties/label","kind":"string","property":"label","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/signal-coverage-forecast.json","pointer":"/properties/scope/properties/product_id","kind":"string","property":"product_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/signal-coverage-forecast.json","pointer":"/properties/scope/properties/countries","kind":"array","property":"countries","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/signal-coverage-forecast.json","pointer":"/properties/scope/properties/line_item_types","kind":"array","property":"line_item_types","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/signal-coverage-forecast.json","pointer":"/properties/scope/properties/line_item_types/items","kind":"string","property":"line_item_types","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/allOf/1/then/properties/restricted_attributes","kind":"array","property":"restricted_attributes","side":"both","stability":"stable","in_last_stable":"unknown","items":"untyped","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/allOf/2/then/properties/restricted_attributes","kind":"array","property":"restricted_attributes","side":"both","stability":"stable","in_last_stable":"unknown","items":"untyped","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/restricted_attributes","kind":"array","property":"restricted_attributes","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/restricted-attribute.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (11 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/policy_categories","kind":"array","property":"policy_categories","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/policy_categories/items","kind":"string","property":"policy_categories","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/taxonomy/properties/version","kind":"string","property":"version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/taxonomy/properties/etag","kind":"string","property":"etag","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/taxonomy/properties/values","kind":"array","property":"values","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/taxonomy/properties/values/items/properties/id","kind":"string","property":"id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/taxonomy/properties/values/items/properties/path","kind":"string","property":"path","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/taxonomy/properties/values/items/properties/modifiers","kind":"array","property":"modifiers","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/taxonomy/properties/values/items/properties/modifiers/items","kind":"string","property":"modifiers","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/taxonomy/properties/value_mappings","kind":"array","property":"value_mappings","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/taxonomy/properties/value_mappings/items/properties/value","kind":"string","property":"value","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/taxonomy/properties/value_mappings/items/properties/taxonomy_value_id","kind":"string","property":"taxonomy_value_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/taxonomy/properties/value_mappings/items/properties/path","kind":"string","property":"path","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/taxonomy/properties/value_mappings/items/properties/modifiers","kind":"array","property":"modifiers","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/taxonomy/properties/value_mappings/items/properties/modifiers/items","kind":"string","property":"modifiers","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/data_sources","kind":"array","property":"data_sources","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (17 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/onboarder/properties/match_keys","kind":"array","property":"match_keys","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (10 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/countries","kind":"array","property":"countries","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/consent_basis","kind":"array","property":"consent_basis","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/consent-basis.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/modeling/properties/training_data_jurisdictions","kind":"array","property":"training_data_jurisdictions","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/data_subject_rights/properties/channels","kind":"array","property":"channels","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/data_subject_rights/properties/channels/items/properties/rights","kind":"array","property":"rights","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/data_subject_rights/properties/channels/items/properties/languages","kind":"array","property":"languages","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 639 / BCP 47 language codes (184 two-letter languages): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/data_subject_rights/properties/channels/items/properties/languages/items","kind":"string","property":"languages","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/data_subject_rights/properties/channels/items/properties/countries","kind":"array","property":"countries","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/data_subject_rights/properties/channels/contains/properties/rights","kind":"array","property":"rights","side":"both","stability":"stable","in_last_stable":"yes","items":"untyped","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-definition-enrichment.json","pointer":"/properties/dts_compliant_version","kind":"string","property":"dts_compliant_version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/allOf/5/if/properties/data_sources","kind":"array","property":"data_sources","side":"other","stability":"stable","in_last_stable":"unknown","items":"untyped","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/allOf/6/then/properties/restricted_attributes","kind":"array","property":"restricted_attributes","side":"other","stability":"stable","in_last_stable":"unknown","items":"untyped","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/allOf/7/then/properties/restricted_attributes","kind":"array","property":"restricted_attributes","side":"other","stability":"stable","in_last_stable":"unknown","items":"untyped","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/id","kind":"string","property":"id","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/tags","kind":"array","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/tags/items","kind":"string","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9_-]+$","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/allowed_values","kind":"array","property":"allowed_values","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/allowed_values/items","kind":"string","property":"allowed_values","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/restricted_attributes","kind":"array","property":"restricted_attributes","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/restricted-attribute.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (11 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/policy_categories","kind":"array","property":"policy_categories","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/policy_categories/items","kind":"string","property":"policy_categories","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/range/properties/unit","kind":"string","property":"unit","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/taxonomy/properties/version","kind":"string","property":"version","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/taxonomy/properties/etag","kind":"string","property":"etag","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/taxonomy/properties/values","kind":"array","property":"values","side":"other","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/taxonomy/properties/values/items/properties/id","kind":"string","property":"id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/taxonomy/properties/values/items/properties/path","kind":"string","property":"path","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/taxonomy/properties/values/items/properties/modifiers","kind":"array","property":"modifiers","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/taxonomy/properties/values/items/properties/modifiers/items","kind":"string","property":"modifiers","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/taxonomy/properties/value_mappings","kind":"array","property":"value_mappings","side":"other","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/taxonomy/properties/value_mappings/items/properties/value","kind":"string","property":"value","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/taxonomy/properties/value_mappings/items/properties/taxonomy_value_id","kind":"string","property":"taxonomy_value_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/taxonomy/properties/value_mappings/items/properties/path","kind":"string","property":"path","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/taxonomy/properties/value_mappings/items/properties/modifiers","kind":"array","property":"modifiers","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/taxonomy/properties/value_mappings/items/properties/modifiers/items","kind":"string","property":"modifiers","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/data_sources","kind":"array","property":"data_sources","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (17 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/onboarder/properties/match_keys","kind":"array","property":"match_keys","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (10 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/id_types","kind":"array","property":"id_types","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/originating_domain","kind":"string","property":"originating_domain","side":"other","stability":"stable","in_last_stable":"yes","format":"hostname","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/countries","kind":"array","property":"countries","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/consent_basis","kind":"array","property":"consent_basis","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/consent-basis.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/modeling/properties/training_data_jurisdictions","kind":"array","property":"training_data_jurisdictions","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/data_subject_rights/properties/channels","kind":"array","property":"channels","side":"other","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/data_subject_rights/properties/channels/items/properties/rights","kind":"array","property":"rights","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/data_subject_rights/properties/channels/items/properties/languages","kind":"array","property":"languages","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 639 / BCP 47 language codes (184 two-letter languages): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/data_subject_rights/properties/channels/items/properties/languages/items","kind":"string","property":"languages","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/data_subject_rights/properties/channels/items/properties/countries","kind":"array","property":"countries","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/data_subject_rights/properties/channels/contains/properties/rights","kind":"array","property":"rights","side":"other","stability":"stable","in_last_stable":"yes","items":"untyped","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-definition.json","pointer":"/properties/dts_compliant_version","kind":"string","property":"dts_compliant_version","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/signal-filters.json","pointer":"/properties/catalog_types","kind":"array","property":"catalog_types","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/signal-catalog-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/signal-filters.json","pointer":"/properties/data_providers","kind":"array","property":"data_providers","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/signal-filters.json","pointer":"/properties/data_providers/items","kind":"string","property":"data_providers","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/signal-id.json","pointer":"/oneOf/0/properties/data_provider_domain","kind":"string","property":"data_provider_domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/signal-id.json","pointer":"/oneOf/0/properties/id","kind":"string","property":"id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/signal-id.json","pointer":"/oneOf/1/properties/id","kind":"string","property":"id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/signal-listing.json","pointer":"/allOf/2/then/properties/restricted_attributes","kind":"array","property":"restricted_attributes","side":"both","stability":"stable","in_last_stable":"unknown","items":"untyped","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-listing.json","pointer":"/allOf/3/then/properties/restricted_attributes","kind":"array","property":"restricted_attributes","side":"both","stability":"stable","in_last_stable":"unknown","items":"untyped","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-listing.json","pointer":"/properties/name","kind":"string","property":"name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/signal-listing.json","pointer":"/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/signal-listing.json","pointer":"/properties/categories","kind":"array","property":"categories","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/signal-listing.json","pointer":"/properties/categories/items","kind":"string","property":"categories","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/signal-listing.json","pointer":"/properties/restricted_attributes","kind":"array","property":"restricted_attributes","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/restricted-attribute.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (11 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/signal-modeling-disclosure.json","pointer":"/properties/jurisdictions","kind":"array","property":"jurisdictions","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-modeling-disclosure.json","pointer":"/properties/jurisdictions/items/properties/region","kind":"string","property":"region","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/signal-modeling-disclosure.json","pointer":"/properties/jurisdictions/items/properties/regulation","kind":"string","property":"regulation","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/signal-modeling-disclosure.json","pointer":"/properties/jurisdictions/items/properties/disclosure_text","kind":"string","property":"disclosure_text","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/signal-pricing.json","pointer":"/oneOf/3/properties/unit","kind":"string","property":"unit","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/signal-pricing.json","pointer":"/oneOf/4/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/signal-pricing.json","pointer":"/oneOf/4/properties/metadata/properties/summary_for_operator","kind":"string","property":"summary_for_operator","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/signal-ref.json","pointer":"/oneOf/0/properties/signal_id","kind":"string","property":"signal_id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/signal-ref.json","pointer":"/oneOf/1/properties/data_provider_domain","kind":"string","property":"data_provider_domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"core/signal-ref.json","pointer":"/oneOf/1/properties/signal_id","kind":"string","property":"signal_id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/signal-ref.json","pointer":"/oneOf/2/properties/signal_id","kind":"string","property":"signal_id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/signal-selection-group-rule.json","pointer":"/properties/selection_group","kind":"string","property":"selection_group","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/signal-targeting-expression.json","pointer":"/oneOf/1/properties/values","kind":"array","property":"values","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-targeting-expression.json","pointer":"/oneOf/1/properties/values/items","kind":"string","property":"values","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/signal-targeting-rules.json","pointer":"/properties/selection_group_rules","kind":"array","property":"selection_group_rules","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/signal-selection-group-rule.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-targeting.json","pointer":"/oneOf/1/properties/values","kind":"array","property":"values","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/signal-targeting.json","pointer":"/oneOf/1/properties/values/items","kind":"string","property":"values","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/sla-window.json","pointer":"/properties/business_calendar_id","kind":"string","property":"business_calendar_id","side":"both","stability":"new-3.3","added_in_3_3":true,"in_last_stable":"no","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"withdrawn (#8501)"}, + {"file":"core/sla-window.json","pointer":"/properties/response_max","kind":"string","property":"response_max","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^P(?!$)(\\d+Y)?(\\d+M)?(\\d+D)?(T(\\d+H)?(\\d+M)?(\\d+S)?)?$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"core/sla-window.json","pointer":"/properties/completion_max","kind":"string","property":"completion_max","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^P(?!$)(\\d+Y)?(\\d+M)?(\\d+D)?(T(\\d+H)?(\\d+M)?(\\d+S)?)?$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"core/special.json","pointer":"/properties/name","kind":"string","property":"name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/spot-reporting-capability.json","pointer":"/properties/available_metrics","kind":"array","property":"available_metrics","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/available-metric.json","proposed_limit":51,"tier":"array-enum","rationale":"Enum-valued items (51 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/store-item.json","pointer":"/properties/store_id","kind":"string","property":"store_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/store-item.json","pointer":"/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/store-item.json","pointer":"/properties/address/properties/street","kind":"string","property":"street","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":200,"tier":"string-id","rationale":"Matches street fields already bounded at 200.","action":"tighten in 4.0"}, + {"file":"core/store-item.json","pointer":"/properties/address/properties/city","kind":"string","property":"city","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":100,"tier":"string-id","rationale":"City name.","action":"tighten in 4.0"}, + {"file":"core/store-item.json","pointer":"/properties/address/properties/region","kind":"string","property":"region","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"core/store-item.json","pointer":"/properties/address/properties/postal_code","kind":"string","property":"postal_code","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/store-item.json","pointer":"/properties/catchments","kind":"array","property":"catchments","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/catchment.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/store-item.json","pointer":"/properties/phone","kind":"string","property":"phone","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":30,"tier":"string-code","rationale":"Matches the phone fields already bounded at 30.","action":"tighten in 4.0"}, + {"file":"core/store-item.json","pointer":"/properties/hours/additionalProperties","kind":"string","property":"hours","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/store-item.json","pointer":"/properties/tags","kind":"array","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/store-item.json","pointer":"/properties/tags/items","kind":"string","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/talent.json","pointer":"/properties/name","kind":"string","property":"name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/targeting-input.json","pointer":"/properties/geo_metros","kind":"array","property":"geo_metros","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/geo-metro.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/targeting-input.json","pointer":"/properties/signal_targeting","kind":"array","property":"signal_targeting","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/signal-targeting.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/targeting-input.json","pointer":"/properties/language","kind":"array","property":"language","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/locale-tag.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/targeting-input.json","pointer":"/properties/keyword_targets","kind":"array","property":"keyword_targets","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/targeting-input.json","pointer":"/properties/keyword_targets/items/properties/keyword","kind":"string","property":"keyword","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/targeting-input.json","pointer":"/properties/negative_keywords","kind":"array","property":"negative_keywords","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/negative-keyword.json","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/targeting-modification.json","pointer":"/oneOf/0/properties/path","kind":"string","property":"path","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^(?:/(?:[^~/]|~[01])*)+$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"core/targeting-modification.json","pointer":"/oneOf/0/properties/reason","kind":"string","property":"reason","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/targeting-modification.json","pointer":"/oneOf/1/properties/selector/properties/system","kind":"string","property":"system","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/targeting-modification.json","pointer":"/oneOf/1/properties/values","kind":"array","property":"values","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/targeting-modification.json","pointer":"/oneOf/1/properties/values/items","kind":"string","property":"values","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/targeting-modification.json","pointer":"/oneOf/1/properties/reason","kind":"string","property":"reason","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/targeting-overlay-requirements.json","pointer":"/properties/geo_proximity/anyOf/1/properties/transport_modes","kind":"array","property":"transport_modes","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/transport-mode.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/targeting-overlay-requirements.json","pointer":"/definitions/metroRequirement/anyOf/1/properties/systems","kind":"array","property":"systems","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/metro-system.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/targeting-overlay-requirements.json","pointer":"/definitions/keywordRequirement/anyOf/1/properties/supported_match_types","kind":"array","property":"supported_match_types","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/match-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/targeting-overlay-requirements.json","pointer":"/definitions/browserRequirement/anyOf/1/properties/families","kind":"array","property":"families","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/browser-family.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (9 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/targeting-overlay-requirements.json","pointer":"/definitions/daypartRequirement/anyOf/1/properties/timezone_modes","kind":"array","property":"timezone_modes","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/daypart-timezone-mode.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/targeting-overlay-requirements.json","pointer":"/definitions/daypartRequirement/anyOf/1/properties/iana_timezones","kind":"array","property":"iana_timezones","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/iana-timezone.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"core/targeting-overlay-support.json","pointer":"/properties/geo_proximity/anyOf/1/properties/transport_modes","kind":"array","property":"transport_modes","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/transport-mode.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/targeting-overlay-support.json","pointer":"/definitions/metroSupport/anyOf/1/properties/systems","kind":"array","property":"systems","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/metro-system.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/targeting-overlay-support.json","pointer":"/definitions/placeCatalogSupport/properties/countries/additionalProperties","kind":"array","property":"countries","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/geo-place-type.json","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/targeting-overlay-support.json","pointer":"/definitions/placeCatalogSupport/properties/current_version","kind":"string","property":"current_version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/targeting-overlay-support.json","pointer":"/definitions/placeCatalogSupport/properties/system_versions","kind":"array","property":"system_versions","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/targeting-overlay-support.json","pointer":"/definitions/placeCatalogSupport/properties/system_versions/items","kind":"string","property":"system_versions","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/targeting-overlay-support.json","pointer":"/definitions/keywordSupport/anyOf/1/properties/supported_match_types","kind":"array","property":"supported_match_types","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/match-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/targeting-overlay-support.json","pointer":"/definitions/browserSupport/anyOf/1/properties/families","kind":"array","property":"families","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/browser-family.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (9 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/targeting-overlay-support.json","pointer":"/definitions/daypartSupport/anyOf/1/properties/timezone_modes","kind":"array","property":"timezone_modes","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/daypart-timezone-mode.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/targeting-overlay-support.json","pointer":"/definitions/daypartSupport/anyOf/1/properties/iana_timezones/anyOf/1","kind":"array","property":"iana_timezones","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/iana-timezone.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/geo_countries","kind":"array","property":"geo_countries","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/geo_countries_exclude","kind":"array","property":"geo_countries_exclude","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/geo_regions","kind":"array","property":"geo_regions","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-enum","rationale":"ISO 3166-2 subdivision codes (about 5,000): 1,000 lets a list name every state or province of several countries.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/geo_regions_exclude","kind":"array","property":"geo_regions_exclude","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/geo_metros","kind":"array","property":"geo_metros","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/geo-metro.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/geo_metros_exclude","kind":"array","property":"geo_metros_exclude","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/geo_metros_exclude/items/properties/values","kind":"array","property":"values","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/geo_metros_exclude/items/properties/values/items","kind":"string","property":"values","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/geo_postal_areas","kind":"array","property":"geo_postal_areas","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/postal-area.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/geo_postal_areas_exclude","kind":"array","property":"geo_postal_areas_exclude","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/postal-area.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/geo_places","kind":"array","property":"geo_places","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/geo-place-area.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/geo_places_exclude","kind":"array","property":"geo_places_exclude","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/geo-place-area.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/daypart_targets","kind":"array","property":"daypart_targets","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/daypart-target.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/axe_include_segment","kind":"string","property":"axe_include_segment","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/axe_exclude_segment","kind":"string","property":"axe_exclude_segment","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/audience_include","kind":"array","property":"audience_include","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/audience_include/items","kind":"string","property":"audience_include","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/audience_exclude","kind":"array","property":"audience_exclude","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/audience_exclude/items","kind":"string","property":"audience_exclude","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/signal_targeting","kind":"array","property":"signal_targeting","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/signal-targeting.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/collection_lists","kind":"array","property":"collection_lists","side":"both","stability":"experimental","added_in_3_3":true,"in_last_stable":"no","items":"$ref /schemas/core/collection-list-ref.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"deferred (SDK generation)"}, + {"file":"core/targeting.json","pointer":"/properties/collection_lists_exclude","kind":"array","property":"collection_lists_exclude","side":"both","stability":"experimental","added_in_3_3":true,"in_last_stable":"no","items":"$ref /schemas/core/collection-list-ref.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"deferred (SDK generation)"}, + {"file":"core/targeting.json","pointer":"/properties/age_restriction/properties/accepted_methods","kind":"array","property":"accepted_methods","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/age-verification-method.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/device_platform","kind":"array","property":"device_platform","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/device-platform.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (12 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/device_platform_exclude","kind":"array","property":"device_platform_exclude","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/device-platform.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (12 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/device_type","kind":"array","property":"device_type","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/device-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/device_type_exclude","kind":"array","property":"device_type_exclude","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/device-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/browser","kind":"array","property":"browser","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/browser-family.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (9 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/browser_exclude","kind":"array","property":"browser_exclude","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/browser-family.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (9 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/store_catchments","kind":"array","property":"store_catchments","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/store_catchments/items/properties/catalog_id","kind":"string","property":"catalog_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/store_catchments/items/properties/store_ids","kind":"array","property":"store_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/store_catchments/items/properties/store_ids/items","kind":"string","property":"store_ids","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/store_catchments/items/properties/catchment_ids","kind":"array","property":"catchment_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/store_catchments/items/properties/catchment_ids/items","kind":"string","property":"catchment_ids","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/geo_proximity","kind":"array","property":"geo_proximity","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/geo_proximity/items/properties/label","kind":"string","property":"label","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/geo_proximity/items/properties/geometry/properties/coordinates","kind":"array","property":"coordinates","side":"both","stability":"stable","in_last_stable":"yes","items":"untyped","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/language","kind":"array","property":"language","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/locale-tag.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/keyword_targets","kind":"array","property":"keyword_targets","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/keyword_targets/items/properties/keyword","kind":"string","property":"keyword","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/targeting.json","pointer":"/properties/negative_keywords","kind":"array","property":"negative_keywords","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/negative-keyword.json","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/task-id.json","pointer":"","kind":"string","property":"","side":"both","stability":"stable","in_last_stable":"no","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/tasks-get-response.json","pointer":"/properties/progress/properties/current_step","kind":"string","property":"current_step","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/tasks-get-response.json","pointer":"/properties/error/properties/code","kind":"string","property":"code","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/tasks-get-response.json","pointer":"/properties/error/properties/message","kind":"string","property":"message","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/tasks-get-response.json","pointer":"/properties/error/properties/details/properties/operation","kind":"string","property":"operation","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/tasks-get-response.json","pointer":"/properties/history","kind":"array","property":"history","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/tasks-list-request.json","pointer":"/properties/filters/properties/protocols","kind":"array","property":"protocols","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/adcp-protocol.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/tasks-list-request.json","pointer":"/properties/filters/properties/statuses","kind":"array","property":"statuses","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/task-status.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (9 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/tasks-list-request.json","pointer":"/properties/filters/properties/task_types","kind":"array","property":"task_types","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/task-type.json","proposed_limit":38,"tier":"array-enum","rationale":"Enum-valued items (38 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/tasks-list-request.json","pointer":"/properties/filters/properties/context_contains","kind":"string","property":"context_contains","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/tasks-list-response.json","pointer":"/properties/query_summary/properties/filters_applied","kind":"array","property":"filters_applied","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/tasks-list-response.json","pointer":"/properties/query_summary/properties/filters_applied/items","kind":"string","property":"filters_applied","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/tasks-list-response.json","pointer":"/properties/query_summary/properties/sort_applied/properties/field","kind":"string","property":"field","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/tasks-list-response.json","pointer":"/properties/tasks","kind":"array","property":"tasks","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"core/tracker-execution-contract.json","pointer":"/properties/honored","kind":"array","property":"honored","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/tracker-execution-selector.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/tracker-execution-selector.json","pointer":"/oneOf/0/properties/selector_id","kind":"string","property":"selector_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/tracker-execution-selector.json","pointer":"/oneOf/0/properties/custom_event_name","kind":"string","property":"custom_event_name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/tracker-execution-selector.json","pointer":"/oneOf/0/properties/firing_paths","kind":"array","property":"firing_paths","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/tracker-firing-path.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/tracker-execution-selector.json","pointer":"/oneOf/1/properties/selector_id","kind":"string","property":"selector_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/tracker-execution-selector.json","pointer":"/oneOf/1/properties/firing_paths","kind":"array","property":"firing_paths","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/tracker-firing-path.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/tracker-execution-selector.json","pointer":"/oneOf/2/properties/selector_id","kind":"string","property":"selector_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/tracker-execution-selector.json","pointer":"/oneOf/2/properties/firing_paths","kind":"array","property":"firing_paths","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/tracker-firing-path.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/transformer-param.json","pointer":"/properties/field","kind":"string","property":"field","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/transformer-param.json","pointer":"/properties/allowed_values","kind":"array","property":"allowed_values","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/transformer-param.json","pointer":"/properties/options","kind":"array","property":"options","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/transformer-param.json","pointer":"/properties/options/items/properties/label","kind":"string","property":"label","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/transformer-param.json","pointer":"/properties/options_cursor","kind":"string","property":"options_cursor","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"core/transformer-param.json","pointer":"/properties/description","kind":"string","property":"description","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/transformer.json","pointer":"/properties/transformer_id","kind":"string","property":"transformer_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/transformer.json","pointer":"/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/transformer.json","pointer":"/properties/description","kind":"string","property":"description","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/transformer.json","pointer":"/properties/voice_synthesis_ref","kind":"array","property":"voice_synthesis_ref","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/transformer.json","pointer":"/properties/voice_synthesis_ref/items/properties/brand_agent/properties/id","kind":"string","property":"id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/transformer.json","pointer":"/properties/voice_synthesis_ref/items/properties/voice_id","kind":"string","property":"voice_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/transformer.json","pointer":"/properties/voice_synthesis_ref/items/properties/rights_id","kind":"string","property":"rights_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/transformer.json","pointer":"/properties/input_format_ids","kind":"array","property":"input_format_ids","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/transformer.json","pointer":"/properties/output_format_ids","kind":"array","property":"output_format_ids","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/transformer.json","pointer":"/properties/input_formats","kind":"array","property":"input_formats","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/transformer.json","pointer":"/properties/output_capability_ids","kind":"array","property":"output_capability_ids","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/transformer.json","pointer":"/properties/output_capability_ids/items","kind":"string","property":"output_capability_ids","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/transformer.json","pointer":"/properties/params","kind":"array","property":"params","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/transformer-param.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/transformer.json","pointer":"/properties/pricing_options","kind":"array","property":"pricing_options","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/vendor-pricing-option.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/transformer.json","pointer":"/properties/multiplicity/properties/variant_dimensions","kind":"array","property":"variant_dimensions","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/truncation-sentinel.json","pointer":"/properties/_truncation/properties/preview","kind":"string","property":"preview","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/truncation-sentinel.json","pointer":"/properties/_truncation/properties/preview_format","kind":"string","property":"preview_format","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/user-match.json","pointer":"/properties/uids","kind":"array","property":"uids","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/user-match.json","pointer":"/properties/uids/items/properties/value","kind":"string","property":"value","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"core/user-match.json","pointer":"/properties/click_id","kind":"string","property":"click_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/user-match.json","pointer":"/properties/click_id_type","kind":"string","property":"click_id_type","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/user-match.json","pointer":"/properties/client_ip","kind":"string","property":"client_ip","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/user-match.json","pointer":"/properties/client_user_agent","kind":"string","property":"client_user_agent","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/vast-media-file-requirements.json","pointer":"/properties/delivery_methods","kind":"array","property":"delivery_methods","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/vast-media-delivery-method.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/vast-media-file-requirements.json","pointer":"/properties/mime_types","kind":"array","property":"mime_types","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/vast-media-file-requirements.json","pointer":"/properties/mime_types/items","kind":"string","property":"mime_types","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[A-Za-z0-9][A-Za-z0-9!#$&^_.+-]*/[A-Za-z0-9][A-Za-z0-9!#$&^_.+-]*$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"core/vast-media-file-requirements.json","pointer":"/properties/containers","kind":"array","property":"containers","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/vast-media-file-requirements.json","pointer":"/properties/containers/items","kind":"string","property":"containers","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9][a-z0-9._+-]*$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"core/vast-media-file-requirements.json","pointer":"/properties/codecs","kind":"array","property":"codecs","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/vast-media-file-requirements.json","pointer":"/properties/codecs/items","kind":"string","property":"codecs","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/vast-tracker-constraints.json","pointer":"/definitions/vast_versions","kind":"array","property":"vast_versions","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/vast-version.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/vehicle-item.json","pointer":"/properties/vehicle_id","kind":"string","property":"vehicle_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/vehicle-item.json","pointer":"/properties/title","kind":"string","property":"title","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/vehicle-item.json","pointer":"/properties/make","kind":"string","property":"make","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/vehicle-item.json","pointer":"/properties/model","kind":"string","property":"model","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/vehicle-item.json","pointer":"/properties/vin","kind":"string","property":"vin","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/vehicle-item.json","pointer":"/properties/trim","kind":"string","property":"trim","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/vehicle-item.json","pointer":"/properties/exterior_color","kind":"string","property":"exterior_color","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/vehicle-item.json","pointer":"/properties/interior_color","kind":"string","property":"interior_color","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/vehicle-item.json","pointer":"/properties/tags","kind":"array","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/vehicle-item.json","pointer":"/properties/tags/items","kind":"string","property":"tags","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/vehicle-item.json","pointer":"/properties/assets","kind":"array","property":"assets","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/offering-asset-group.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/vendor-metric-optimization-supported-metric.json","pointer":"/properties/supported_targets","kind":"array","property":"supported_targets","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/vendor-metric-optimization.json","pointer":"/properties/supported_metrics","kind":"array","property":"supported_metrics","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/vendor-metric-optimization-supported-metric.json","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/vendor-metric-value.json","pointer":"/properties/unit","kind":"string","property":"unit","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"core/vendor-pricing-option.json","pointer":"/allOf/0/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/vendor-pricing-option.json","pointer":"/allOf/0/properties/applies_to_output_format_ids","kind":"array","property":"applies_to_output_format_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/vendor-pricing-option.json","pointer":"/allOf/0/properties/applies_to_output_capability_ids","kind":"array","property":"applies_to_output_capability_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/vendor-pricing-option.json","pointer":"/allOf/0/properties/applies_to_output_capability_ids/items","kind":"string","property":"applies_to_output_capability_ids","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/verification-token-claims.json","pointer":"/properties/jti","kind":"string","property":"jti","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/verification-token-claims.json","pointer":"/properties/verified_specialisms","kind":"array","property":"verified_specialisms","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/verification-token-claims.json","pointer":"/properties/verified_specialisms/items","kind":"string","property":"verified_specialisms","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/verification-token-claims.json","pointer":"/properties/verification_modes","kind":"array","property":"verification_modes","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/VerificationTokenMode","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/verification-token-claims.json","pointer":"/properties/adcp_version","kind":"string","property":"adcp_version","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[1-9][0-9]*\\.[0-9]+$","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/verification-token-claims.json","pointer":"/properties/protocol_version","kind":"string","property":"protocol_version","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/version-envelope.json","pointer":"/properties/adcp_version","kind":"string","property":"adcp_version","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/warning-resource.json","pointer":"/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/warning-resource.json","pointer":"/properties/package_id","kind":"string","property":"package_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/warning-resource.json","pointer":"/properties/creative_id","kind":"string","property":"creative_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/webhook-activity-record.json","pointer":"/properties/idempotency_key","kind":"string","property":"idempotency_key","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/webhook-activity-record.json","pointer":"/properties/subscriber_id","kind":"string","property":"subscriber_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/webhook-challenge.json","pointer":"/properties/account_id","kind":"string","property":"account_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/webhook-challenge.json","pointer":"/properties/event_types","kind":"array","property":"event_types","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/notification-type.json","proposed_limit":33,"tier":"array-enum","rationale":"Enum-valued items (33 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/0/properties/payload/properties/product_id","kind":"string","property":"product_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/1/properties/payload/properties/product_id","kind":"string","property":"product_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/1/properties/payload/properties/changed_fields","kind":"array","property":"changed_fields","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/1/properties/payload/properties/changed_fields/items","kind":"string","property":"changed_fields","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/2/properties/payload/properties/product_id","kind":"string","property":"product_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/2/properties/payload/properties/pricing_options","kind":"array","property":"pricing_options","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/pricing-option.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/2/properties/payload/properties/canonical_pricing_options","kind":"array","property":"canonical_pricing_options","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-pricing-option.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/2/properties/payload/properties/previous_pricing_option_ids","kind":"array","property":"previous_pricing_option_ids","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/2/properties/payload/properties/previous_pricing_option_ids/items","kind":"string","property":"previous_pricing_option_ids","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/3/properties/payload/properties/product_id","kind":"string","property":"product_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/4/properties/payload/properties/signal_agent_segment_id","kind":"string","property":"signal_agent_segment_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/5/properties/payload/properties/signal_agent_segment_id","kind":"string","property":"signal_agent_segment_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/5/properties/payload/properties/changed_fields","kind":"array","property":"changed_fields","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/5/properties/payload/properties/changed_fields/items","kind":"string","property":"changed_fields","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/6/properties/payload/properties/signal_agent_segment_id","kind":"string","property":"signal_agent_segment_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/6/properties/payload/properties/pricing_options","kind":"array","property":"pricing_options","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/vendor-pricing-option.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/6/properties/payload/properties/previous_pricing_option_ids","kind":"array","property":"previous_pricing_option_ids","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/6/properties/payload/properties/previous_pricing_option_ids/items","kind":"string","property":"previous_pricing_option_ids","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/7/properties/payload/properties/signal_agent_segment_id","kind":"string","property":"signal_agent_segment_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/8/properties/payload/properties/summary","kind":"string","property":"summary","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/9/properties/payload/properties/changed_fields","kind":"array","property":"changed_fields","side":"response","stability":"stable","added_in_3_3":true,"in_last_stable":"unknown","marker_conflict":true,"items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/9/properties/payload/properties/changed_fields/items","kind":"string","property":"changed_fields","side":"response","stability":"stable","added_in_3_3":true,"in_last_stable":"unknown","marker_conflict":true,"proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/oneOf/11/properties/payload/properties/summary","kind":"string","property":"summary","side":"response","stability":"stable","added_in_3_3":true,"in_last_stable":"unknown","marker_conflict":true,"proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/properties/entity_id","kind":"string","property":"entity_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/$defs/appliesTo/oneOf/1/properties/account_ids","kind":"array","property":"account_ids","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/$defs/appliesTo/oneOf/1/properties/account_ids/items","kind":"string","property":"account_ids","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/$defs/signal/properties/signal_agent_segment_id","kind":"string","property":"signal_agent_segment_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/$defs/signal/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/$defs/signal/properties/description","kind":"string","property":"description","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/$defs/signal/properties/categories","kind":"array","property":"categories","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/$defs/signal/properties/categories/items","kind":"string","property":"categories","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/$defs/signal/properties/data_provider","kind":"string","property":"data_provider","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/$defs/signal/properties/deployments","kind":"array","property":"deployments","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/deployment.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-event.json","pointer":"/$defs/signal/properties/pricing_options","kind":"array","property":"pricing_options","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/vendor-pricing-option.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-webhook.json","pointer":"/properties/account_id","kind":"string","property":"account_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-webhook.json","pointer":"/properties/wholesale_feed_version","kind":"string","property":"wholesale_feed_version","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"core/wholesale-feed-webhook.json","pointer":"/properties/previous_wholesale_feed_version","kind":"string","property":"previous_wholesale_feed_version","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"creative/audit-observation.json","pointer":"/properties/field","kind":"string","property":"field","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/audit-observation.json","pointer":"/properties/message","kind":"string","property":"message","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"creative/audit-observation.json","pointer":"/properties/details/properties/feature_id","kind":"string","property":"feature_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/audit-observation.json","pointer":"/properties/details/properties/observed_value","kind":"string","property":"observed_value","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/creative-assignment-changed-webhook.json","pointer":"/properties/account_id","kind":"string","property":"account_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/creative-assignment-changed-webhook.json","pointer":"/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/creative-assignment-changed-webhook.json","pointer":"/properties/package_id","kind":"string","property":"package_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/creative-assignment-changed-webhook.json","pointer":"/properties/creative_id","kind":"string","property":"creative_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/creative-feature-result.json","pointer":"/properties/feature_id","kind":"string","property":"feature_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/creative-feature-result.json","pointer":"/properties/value/oneOf/2","kind":"string","property":"value","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"creative/creative-feature-result.json","pointer":"/properties/unit","kind":"string","property":"unit","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"creative/creative-feature-result.json","pointer":"/properties/methodology_version","kind":"string","property":"methodology_version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"creative/creative-feature-result.json","pointer":"/properties/policy_id","kind":"string","property":"policy_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/creative-purged-webhook.json","pointer":"/properties/account_id","kind":"string","property":"account_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/creative-purged-webhook.json","pointer":"/properties/creative_id","kind":"string","property":"creative_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/creative-status-changed-webhook.json","pointer":"/properties/account_id","kind":"string","property":"account_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/creative-status-changed-webhook.json","pointer":"/properties/creative_id","kind":"string","property":"creative_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/get-creative-delivery-request.json","pointer":"/properties/media_buy_ids","kind":"array","property":"media_buy_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"creative/get-creative-delivery-request.json","pointer":"/properties/media_buy_ids/items","kind":"string","property":"media_buy_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/get-creative-delivery-request.json","pointer":"/properties/creative_ids","kind":"array","property":"creative_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"creative/get-creative-delivery-request.json","pointer":"/properties/creative_ids/items","kind":"string","property":"creative_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/get-creative-delivery-response.json","pointer":"/properties/account_id","kind":"string","property":"account_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/get-creative-delivery-response.json","pointer":"/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/get-creative-delivery-response.json","pointer":"/properties/reporting_period/properties/timezone","kind":"string","property":"timezone","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"creative/get-creative-delivery-response.json","pointer":"/properties/creatives","kind":"array","property":"creatives","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"creative/get-creative-delivery-response.json","pointer":"/properties/creatives/items/properties/creative_id","kind":"string","property":"creative_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/get-creative-delivery-response.json","pointer":"/properties/creatives/items/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/get-creative-delivery-response.json","pointer":"/properties/creatives/items/properties/variants","kind":"array","property":"variants","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/creative-variant.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/get-creative-delivery-response.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"creative/get-creative-features-async-response-submitted.json","pointer":"/properties/evaluation_id","kind":"string","property":"evaluation_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/get-creative-features-request.json","pointer":"/properties/feature_ids","kind":"array","property":"feature_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"creative/get-creative-features-request.json","pointer":"/properties/feature_ids/items","kind":"string","property":"feature_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/get-creative-features-response.json","pointer":"/oneOf/1/properties/evaluation_id","kind":"string","property":"evaluation_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/get-creative-features-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"creative/get-creative-features-response.json","pointer":"/oneOf/2/properties/evaluation_id","kind":"string","property":"evaluation_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/get-creative-features-terminal-success.json","pointer":"/properties/evaluation_id","kind":"string","property":"evaluation_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/get-creative-features-terminal-success.json","pointer":"/properties/results","kind":"array","property":"results","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/creative/creative-feature-result.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/get-creative-features-terminal-success.json","pointer":"/properties/audit_observations","kind":"array","property":"audit_observations","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/creative/audit-observation.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/get-creative-features-terminal-success.json","pointer":"/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/list-creative-formats-request.json","pointer":"/properties/format_ids","kind":"array","property":"format_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"creative/list-creative-formats-request.json","pointer":"/properties/asset_types","kind":"array","property":"asset_types","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/asset-content-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (17 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"creative/list-creative-formats-request.json","pointer":"/properties/name_search","kind":"string","property":"name_search","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/list-creative-formats-request.json","pointer":"/properties/disclosure_positions","kind":"array","property":"disclosure_positions","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/disclosure-position.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (8 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"creative/list-creative-formats-request.json","pointer":"/properties/disclosure_persistence","kind":"array","property":"disclosure_persistence","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/disclosure-persistence.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"creative/list-creative-formats-request.json","pointer":"/properties/output_format_ids","kind":"array","property":"output_format_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"creative/list-creative-formats-request.json","pointer":"/properties/input_format_ids","kind":"array","property":"input_format_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"creative/list-creative-formats-response.json","pointer":"/properties/formats","kind":"array","property":"formats","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format.json","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"creative/list-creative-formats-response.json","pointer":"/properties/creative_agents","kind":"array","property":"creative_agents","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"creative/list-creative-formats-response.json","pointer":"/properties/creative_agents/items/properties/agent_name","kind":"string","property":"agent_name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/list-creative-formats-response.json","pointer":"/properties/creative_agents/items/properties/capabilities","kind":"array","property":"capabilities","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/creative-agent-capability.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"creative/list-creative-formats-response.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-request.json","pointer":"/properties/fields","kind":"array","property":"fields","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (22 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/query_summary/properties/filters_applied","kind":"array","property":"filters_applied","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/query_summary/properties/filters_applied/items","kind":"string","property":"filters_applied","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/query_summary/properties/sort_applied/properties/field","kind":"string","property":"field","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives","kind":"array","property":"creatives","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/creative_id","kind":"string","property":"creative_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/seller_revision","kind":"string","property":"seller_revision","side":"response","stability":"new-3.3","added_in_3_3":true,"in_last_stable":"no","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"deferred (SDK generation)"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/assets/patternProperties/^/oneOf/1","kind":"array","property":"^","side":"response","stability":"stable","in_last_stable":"unknown","items":"$ref /schemas/core/assets/asset-union.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/localization_unavailable/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/tags","kind":"array","property":"tags","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/tags/items","kind":"string","property":"tags","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/rights","kind":"array","property":"rights","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/rights-constraint.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/rights_attestation_evaluations","kind":"array","property":"rights_attestation_evaluations","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/rights-attestation-evaluation.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/concept_id","kind":"string","property":"concept_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/concept_name","kind":"string","property":"concept_name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/variables","kind":"array","property":"variables","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/creative-variable.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/assignments/properties/assigned_packages","kind":"array","property":"assigned_packages","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/assignments/properties/assigned_packages/items/properties/package_id","kind":"string","property":"package_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/assignments/properties/assigned_packages/items/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/assignments/properties/assigned_packages/items/properties/rejection_reason","kind":"string","property":"rejection_reason","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/assignments/properties/assigned_packages/items/properties/approval_scopes","kind":"array","property":"approval_scopes","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/creative-approval-scope.json","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/assignments/properties/assigned_packages/items/properties/indicators","kind":"array","property":"indicators","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/indicator.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/assignments/properties/assigned_packages/items/properties/indicator_types_evaluated","kind":"array","property":"indicator_types_evaluated","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/indicator-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (9 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/assignments/properties/assigned_packages/items/properties/indicators_evaluated_scope","kind":"array","property":"indicators_evaluated_scope","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/indicator-scope.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/items","kind":"array","property":"items","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/creative-item.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/creatives/items/properties/pricing_options","kind":"array","property":"pricing_options","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/vendor-pricing-option.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/list-creatives-response.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"creative/list-transformers-request.json","pointer":"/properties/transformer_ids","kind":"array","property":"transformer_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"creative/list-transformers-request.json","pointer":"/properties/transformer_ids/items","kind":"string","property":"transformer_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/list-transformers-request.json","pointer":"/properties/input_format_ids","kind":"array","property":"input_format_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"creative/list-transformers-request.json","pointer":"/properties/output_format_ids","kind":"array","property":"output_format_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"creative/list-transformers-request.json","pointer":"/properties/input_format_kinds","kind":"array","property":"input_format_kinds","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-format-kind.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (16 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"creative/list-transformers-request.json","pointer":"/properties/output_capability_ids","kind":"array","property":"output_capability_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"creative/list-transformers-request.json","pointer":"/properties/output_capability_ids/items","kind":"string","property":"output_capability_ids","side":"request","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/list-transformers-request.json","pointer":"/properties/name_search","kind":"string","property":"name_search","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/list-transformers-request.json","pointer":"/properties/brief","kind":"string","property":"brief","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":100000,"tier":"string-body","rationale":"Long-form body; matches content (100,000) and transcript (200,000) already in the schemas.","action":"tighten in 4.0"}, + {"file":"creative/list-transformers-request.json","pointer":"/properties/expand_params","kind":"array","property":"expand_params","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"creative/list-transformers-request.json","pointer":"/properties/expand_params/items","kind":"string","property":"expand_params","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/list-transformers-request.json","pointer":"/properties/expand_pagination","kind":"array","property":"expand_pagination","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"creative/list-transformers-request.json","pointer":"/properties/expand_pagination/items/properties/transformer_id","kind":"string","property":"transformer_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/list-transformers-request.json","pointer":"/properties/expand_pagination/items/properties/field","kind":"string","property":"field","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/list-transformers-request.json","pointer":"/properties/expand_pagination/items/properties/options_cursor","kind":"string","property":"options_cursor","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"creative/list-transformers-response.json","pointer":"/properties/transformers","kind":"array","property":"transformers","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/transformer.json","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"creative/list-transformers-response.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-request.json","pointer":"/properties/target_capability_id","kind":"string","property":"target_capability_id","side":"request","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-request.json","pointer":"/properties/inputs","kind":"array","property":"inputs","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-request.json","pointer":"/properties/inputs/items/properties/name","kind":"string","property":"name","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-request.json","pointer":"/properties/inputs/items/properties/macros/additionalProperties","kind":"string","property":"macros","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-request.json","pointer":"/properties/inputs/items/properties/context_description","kind":"string","property":"context_description","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-request.json","pointer":"/properties/template_id","kind":"string","property":"template_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-request.json","pointer":"/properties/requests/items/properties/target_capability_id","kind":"string","property":"target_capability_id","side":"request","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-request.json","pointer":"/properties/requests/items/properties/creative_id","kind":"string","property":"creative_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-request.json","pointer":"/properties/requests/items/properties/inputs","kind":"array","property":"inputs","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-request.json","pointer":"/properties/requests/items/properties/inputs/items/properties/name","kind":"string","property":"name","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-request.json","pointer":"/properties/requests/items/properties/inputs/items/properties/macros/additionalProperties","kind":"string","property":"macros","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-request.json","pointer":"/properties/requests/items/properties/inputs/items/properties/context_description","kind":"string","property":"context_description","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-request.json","pointer":"/properties/requests/items/properties/template_id","kind":"string","property":"template_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-request.json","pointer":"/properties/variant_id","kind":"string","property":"variant_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-request.json","pointer":"/properties/creative_id","kind":"string","property":"creative_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-response.json","pointer":"/oneOf/0/properties/previews","kind":"array","property":"previews","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-response.json","pointer":"/oneOf/0/properties/previews/items/properties/preview_id","kind":"string","property":"preview_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-response.json","pointer":"/oneOf/0/properties/previews/items/properties/renders","kind":"array","property":"renders","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/creative/preview-render.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-response.json","pointer":"/oneOf/0/properties/previews/items/properties/input/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-response.json","pointer":"/oneOf/0/properties/previews/items/properties/input/properties/macros/additionalProperties","kind":"string","property":"macros","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-response.json","pointer":"/oneOf/0/properties/previews/items/properties/input/properties/context_description","kind":"string","property":"context_description","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-response.json","pointer":"/oneOf/1/properties/results","kind":"array","property":"results","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-response.json","pointer":"/oneOf/1/properties/results/items/properties/creative_id","kind":"string","property":"creative_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-response.json","pointer":"/oneOf/1/properties/results/items/properties/response/properties/previews","kind":"array","property":"previews","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-response.json","pointer":"/oneOf/1/properties/results/items/properties/response/properties/previews/items/properties/preview_id","kind":"string","property":"preview_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-response.json","pointer":"/oneOf/1/properties/results/items/properties/response/properties/previews/items/properties/renders","kind":"array","property":"renders","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/creative/preview-render.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-response.json","pointer":"/oneOf/1/properties/results/items/properties/response/properties/previews/items/properties/input/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-response.json","pointer":"/oneOf/1/properties/results/items/properties/response/properties/previews/items/properties/input/properties/macros/additionalProperties","kind":"string","property":"macros","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-response.json","pointer":"/oneOf/1/properties/results/items/properties/response/properties/previews/items/properties/input/properties/context_description","kind":"string","property":"context_description","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-response.json","pointer":"/oneOf/1/properties/results/items/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-response.json","pointer":"/oneOf/2/properties/variant_id","kind":"string","property":"variant_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-response.json","pointer":"/oneOf/2/properties/creative_id","kind":"string","property":"creative_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-response.json","pointer":"/oneOf/2/properties/previews","kind":"array","property":"previews","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-response.json","pointer":"/oneOf/2/properties/previews/items/properties/preview_id","kind":"string","property":"preview_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-creative-response.json","pointer":"/oneOf/2/properties/previews/items/properties/renders","kind":"array","property":"renders","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/creative/preview-render.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/preview-render.json","pointer":"/oneOf/0/properties/render_id","kind":"string","property":"render_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-render.json","pointer":"/oneOf/0/properties/role","kind":"string","property":"role","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/preview-render.json","pointer":"/oneOf/0/properties/embedding/properties/csp_policy","kind":"string","property":"csp_policy","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-render.json","pointer":"/oneOf/1/properties/render_id","kind":"string","property":"render_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-render.json","pointer":"/oneOf/1/properties/preview_html","kind":"string","property":"preview_html","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":100000,"tier":"string-body","rationale":"Long-form body; matches content (100,000) and transcript (200,000) already in the schemas.","action":"tighten in 4.0"}, + {"file":"creative/preview-render.json","pointer":"/oneOf/1/properties/role","kind":"string","property":"role","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/preview-render.json","pointer":"/oneOf/1/properties/embedding/properties/csp_policy","kind":"string","property":"csp_policy","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-render.json","pointer":"/oneOf/2/properties/render_id","kind":"string","property":"render_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/preview-render.json","pointer":"/oneOf/2/properties/preview_html","kind":"string","property":"preview_html","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":100000,"tier":"string-body","rationale":"Long-form body; matches content (100,000) and transcript (200,000) already in the schemas.","action":"tighten in 4.0"}, + {"file":"creative/preview-render.json","pointer":"/oneOf/2/properties/role","kind":"string","property":"role","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/preview-render.json","pointer":"/oneOf/2/properties/embedding/properties/csp_policy","kind":"string","property":"csp_policy","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-async-response-submitted.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-async-response-working.json","pointer":"/properties/current_step","kind":"string","property":"current_step","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/creative_ids/items","kind":"string","property":"creative_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/assignments","kind":"array","property":"assignments","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/assignments/items/properties/creative_id","kind":"string","property":"creative_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/assignments/items/properties/package_id","kind":"string","property":"package_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/assignments/items/properties/trackers","kind":"array","property":"trackers","side":"request","stability":"new-3.3","added_in_3_3":true,"in_last_stable":"no","items":"$ref /schemas/core/assignment-tracker.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"withdrawn (#8501)"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/assignments/items/properties/placement_ids","kind":"array","property":"placement_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/assignments/items/properties/placement_ids/items","kind":"string","property":"placement_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/assignment_operations/items/oneOf/0/properties/creative_id","kind":"string","property":"creative_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/assignment_operations/items/oneOf/0/properties/package_id","kind":"string","property":"package_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/assignment_operations/items/oneOf/0/properties/placement_ids","kind":"array","property":"placement_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/assignment_operations/items/oneOf/0/properties/placement_ids/items","kind":"string","property":"placement_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/assignment_operations/items/oneOf/1/properties/creative_id","kind":"string","property":"creative_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/assignment_operations/items/oneOf/1/properties/package_id","kind":"string","property":"package_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/assignment_operations/items/oneOf/2/properties/creative_id","kind":"string","property":"creative_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/assignment_operations/items/oneOf/2/properties/replaces_creative_id","kind":"string","property":"replaces_creative_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/assignment_operations/items/oneOf/2/properties/package_id","kind":"string","property":"package_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/assignment_operations/items/oneOf/2/properties/placement_ids","kind":"array","property":"placement_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/assignment_operations/items/oneOf/2/properties/placement_ids/items","kind":"string","property":"placement_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/assignment_operations/items/oneOf/3/properties/creative_id","kind":"string","property":"creative_id","side":"request","stability":"stable","added_in_3_3":true,"in_last_stable":"unknown","marker_conflict":true,"proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-request.json","pointer":"/properties/assignment_operations/items/oneOf/3/properties/package_id","kind":"string","property":"package_id","side":"request","stability":"stable","added_in_3_3":true,"in_last_stable":"unknown","marker_conflict":true,"proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-response.json","pointer":"/oneOf/0/properties/creatives","kind":"array","property":"creatives","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-response.json","pointer":"/oneOf/0/properties/creatives/items/properties/creative_id","kind":"string","property":"creative_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-response.json","pointer":"/oneOf/0/properties/creatives/items/properties/platform_id","kind":"string","property":"platform_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-response.json","pointer":"/oneOf/0/properties/creatives/items/properties/changes","kind":"array","property":"changes","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-response.json","pointer":"/oneOf/0/properties/creatives/items/properties/changes/items","kind":"string","property":"changes","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-response.json","pointer":"/oneOf/0/properties/creatives/items/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-response.json","pointer":"/oneOf/0/properties/creatives/items/properties/warnings","kind":"array","property":"warnings","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-response.json","pointer":"/oneOf/0/properties/creatives/items/properties/warnings/items","kind":"string","property":"warnings","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-response.json","pointer":"/oneOf/0/properties/creatives/items/properties/macro_resolution_results","kind":"array","property":"macro_resolution_results","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/macro-resolution-result.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-response.json","pointer":"/oneOf/0/properties/creatives/items/properties/assigned_to","kind":"array","property":"assigned_to","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-response.json","pointer":"/oneOf/0/properties/creatives/items/properties/assigned_to/items","kind":"string","property":"assigned_to","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-response.json","pointer":"/oneOf/0/properties/creatives/items/properties/assignment_errors/patternProperties/^[a-zA-Z0-9_-]+$","kind":"string","property":"^[a-zA-Z0-9_-]+$","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"creative/sync-creatives-response.json","pointer":"/oneOf/2/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"creative/validate-input-request.json","pointer":"/properties/targets/items/oneOf/0/properties/id","kind":"string","property":"id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/validate-input-request.json","pointer":"/properties/targets/items/oneOf/1/properties/id","kind":"string","property":"id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/validate-input-request.json","pointer":"/properties/targets/items/oneOf/3/properties/id","kind":"string","property":"id","side":"request","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/validate-input-response.json","pointer":"/properties/results","kind":"array","property":"results","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/creative/validate-input-result.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/validate-input-result.json","pointer":"/properties/target/properties/id","kind":"string","property":"id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"creative/validate-input-result.json","pointer":"/properties/violations","kind":"array","property":"violations","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"creative/validate-input-result.json","pointer":"/properties/violations/items/properties/rule","kind":"string","property":"rule","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/validate-input-result.json","pointer":"/properties/violations/items/properties/field","kind":"string","property":"field","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/validate-input-result.json","pointer":"/properties/warnings","kind":"array","property":"warnings","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"creative/validate-input-result.json","pointer":"/properties/warnings/items/properties/rule","kind":"string","property":"rule","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/validate-input-result.json","pointer":"/properties/macro_resolution_results","kind":"array","property":"macro_resolution_results","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/macro-resolution-result.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/video-brief.json","pointer":"/properties/segments","kind":"array","property":"segments","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"creative/video-brief.json","pointer":"/properties/segments/items/properties/prompt","kind":"string","property":"prompt","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":100000,"tier":"string-body","rationale":"Long-form body; matches content (100,000) and transcript (200,000) already in the schemas.","action":"tighten in 4.0"}, + {"file":"creative/video-brief.json","pointer":"/properties/segments/items/properties/vo","kind":"string","property":"vo","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"creative/video-brief.json","pointer":"/properties/segments/items/properties/caption","kind":"string","property":"caption","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"enums/universal-macro.json","pointer":"","kind":"string","property":"","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"error-details/account-setup-required.json","pointer":"/properties/setup_steps","kind":"array","property":"setup_steps","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"error-details/account-setup-required.json","pointer":"/properties/setup_steps/items","kind":"string","property":"setup_steps","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"error-details/action-not-allowed.json","pointer":"/properties/currently_available_actions","kind":"array","property":"currently_available_actions","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/media-buy-available-action.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"error-details/authorization-required.json","pointer":"/properties/required_connections","kind":"array","property":"required_connections","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/downstream-connection-requirement.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"error-details/authorization-required.json","pointer":"/properties/missing_connections","kind":"array","property":"missing_connections","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/downstream-connection-requirement.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"error-details/authorization-required.json","pointer":"/properties/authorization_instructions","kind":"string","property":"authorization_instructions","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"error-details/billing-not-supported.json","pointer":"/properties/supported_billing","kind":"array","property":"supported_billing","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/billing-party.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"error-details/budget-too-low.json","pointer":"/properties/currency","kind":"string","property":"currency","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"error-details/conflict.json","pointer":"/properties/resource_id","kind":"string","property":"resource_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"error-details/conflict.json","pointer":"/properties/expected_version","kind":"string","property":"expected_version","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"error-details/conflict.json","pointer":"/properties/current_version","kind":"string","property":"current_version","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"error-details/creative-rejected.json","pointer":"/properties/policy_id","kind":"string","property":"policy_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"error-details/creative-rejected.json","pointer":"/properties/reasons","kind":"array","property":"reasons","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"error-details/creative-rejected.json","pointer":"/properties/reasons/items","kind":"string","property":"reasons","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"error-details/creative-representation-unresolved.json","pointer":"/properties/representation_rejections","kind":"array","property":"representation_rejections","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/representation-rejection.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"error-details/creative-revision-content-mismatch.json","pointer":"/properties/creative_id","kind":"string","property":"creative_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"error-details/execution-requirement-unmet.json","pointer":"/properties/unmet_requirements","kind":"array","property":"unmet_requirements","side":"other","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"error-details/execution-requirement-unmet.json","pointer":"/properties/unmet_requirements/items/properties/product_id","kind":"string","property":"product_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"error-details/execution-requirement-unmet.json","pointer":"/properties/unmet_requirements/items/properties/field","kind":"string","property":"field","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"error-details/macro-resolution-failed.json","pointer":"/properties/macro_resolution_results","kind":"array","property":"macro_resolution_results","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/macro-resolution-result.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"error-details/policy-violation.json","pointer":"/properties/policy_id","kind":"string","property":"policy_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"error-details/policy-violation.json","pointer":"/properties/seller_policy_ref","kind":"string","property":"seller_policy_ref","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"error-details/policy-violation.json","pointer":"/properties/violated_rules","kind":"array","property":"violated_rules","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"error-details/policy-violation.json","pointer":"/properties/violated_rules/items","kind":"string","property":"violated_rules","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"error-details/policy-violation.json","pointer":"/properties/category","kind":"string","property":"category","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"error-details/requote-required.json","pointer":"/properties/envelope_field/oneOf/0","kind":"string","property":"envelope_field","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"error-details/requote-required.json","pointer":"/properties/envelope_field/oneOf/1","kind":"array","property":"envelope_field","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"error-details/requote-required.json","pointer":"/properties/envelope_field/oneOf/1/items","kind":"string","property":"envelope_field","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"error-details/stale-response.json","pointer":"/properties/upstream/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"error-details/stale-response.json","pointer":"/properties/original_error/properties/code","kind":"string","property":"code","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"error-details/stale-response.json","pointer":"/properties/original_error/properties/message","kind":"string","property":"message","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"error-details/unsupported-refinement-dimension.json","pointer":"/properties/unsupported_dimension","kind":"string","property":"unsupported_dimension","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"error-details/unsupported-refinement-dimension.json","pointer":"/properties/supported_dimensions","kind":"array","property":"supported_dimensions","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"error-details/unsupported-refinement-dimension.json","pointer":"/properties/supported_dimensions/items","kind":"string","property":"supported_dimensions","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"error-details/vast-version-mismatch.json","pointer":"/properties/observed_document_vast_version/anyOf/0","kind":"string","property":"observed_document_vast_version","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"error-details/vast-version-mismatch.json","pointer":"/properties/product_vast_versions","kind":"array","property":"product_vast_versions","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/vast-version.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"error-details/vast-version-mismatch.json","pointer":"/properties/seller_vast_versions","kind":"array","property":"seller_vast_versions","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/vast-version.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"error-details/vast-version-mismatch.json","pointer":"/properties/supported_versions","kind":"array","property":"supported_versions","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/vast-version.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"error-details/vendor-error-codes.json","pointer":"/properties/vendors/additionalProperties/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"error-details/vendor-error-codes.json","pointer":"/properties/vendors/additionalProperties/properties/codes/additionalProperties/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"error-details/version-unsupported.json","pointer":"/properties/supported_versions","kind":"array","property":"supported_versions","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"error-details/version-unsupported.json","pointer":"/properties/supported_versions/items","kind":"string","property":"supported_versions","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"error-details/version-unsupported.json","pointer":"/properties/supported_majors","kind":"array","property":"supported_majors","side":"other","stability":"stable","in_last_stable":"yes","items":"integer","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"error-details/version-unsupported.json","pointer":"/properties/build_version","kind":"string","property":"build_version","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?(\\+[a-zA-Z0-9.-]+)?$","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"extensions/extension-meta.json","pointer":"/properties/$id","kind":"string","property":"$id","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^/schemas/extensions/[a-z][a-z0-9_]*\\.json$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"extensions/extension-meta.json","pointer":"/properties/title","kind":"string","property":"title","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"extensions/extension-meta.json","pointer":"/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"extensions/extension-meta.json","pointer":"/properties/valid_from","kind":"string","property":"valid_from","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^\\d+\\.\\d+$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"extensions/extension-meta.json","pointer":"/properties/valid_until","kind":"string","property":"valid_until","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^\\d+\\.\\d+$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"extensions/extension-meta.json","pointer":"/properties/required","kind":"array","property":"required","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"extensions/extension-meta.json","pointer":"/properties/required/items","kind":"string","property":"required","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"formats/canonical/_base.json","pointer":"/properties/since_version","kind":"string","property":"since_version","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[1-9]\\d*\\.(0|[1-9]\\d*)$","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"formats/canonical/_base.json","pointer":"/properties/migration_target_version","kind":"string","property":"migration_target_version","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[1-9]\\d*\\.(0|[1-9]\\d*)$","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"formats/canonical/_base.json","pointer":"/properties/platform_extensions","kind":"array","property":"platform_extensions","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/platform-extension-ref.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/_base.json","pointer":"/properties/slots","kind":"array","property":"slots","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/_base.json","pointer":"/properties/slots/items/properties/asset_group_id","kind":"string","property":"asset_group_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"formats/canonical/_base.json","pointer":"/properties/slots/items/properties/pixel_ratios","kind":"array","property":"pixel_ratios","side":"both","stability":"stable","in_last_stable":"yes","items":"number","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/_base.json","pointer":"/properties/slots/items/properties/required_pixel_ratios","kind":"array","property":"required_pixel_ratios","side":"both","stability":"stable","in_last_stable":"yes","items":"number","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/_base.json","pointer":"/properties/slots/items/properties/logo_slots","kind":"array","property":"logo_slots","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/logo-slot.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (13 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"formats/canonical/_base.json","pointer":"/properties/slots/items/properties/required_logo_slots","kind":"array","property":"required_logo_slots","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/logo-slot.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (13 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"formats/canonical/_base.json","pointer":"/properties/slots/items/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"formats/canonical/_base.json","pointer":"/properties/required_connections","kind":"array","property":"required_connections","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/downstream-connection-requirement.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/agent_placement.json","pointer":"/properties/tone_constraints","kind":"array","property":"tone_constraints","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/agent_placement.json","pointer":"/properties/tone_constraints/items","kind":"string","property":"tone_constraints","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"formats/canonical/audio_hosted.json","pointer":"/properties/audio_codecs","kind":"array","property":"audio_codecs","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"formats/canonical/audio_hosted.json","pointer":"/properties/audio_sample_rates","kind":"array","property":"audio_sample_rates","side":"both","stability":"stable","in_last_stable":"yes","items":"integer","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/audio_hosted.json","pointer":"/properties/audio_channels","kind":"array","property":"audio_channels","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"formats/canonical/audio_hosted.json","pointer":"/properties/companion_image_aspect_ratio","kind":"string","property":"companion_image_aspect_ratio","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"formats/canonical/audio_vast.json","pointer":"/properties/vast_versions","kind":"array","property":"vast_versions","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/vast-version.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"formats/canonical/coordinated_placements.json","pointer":"/properties/components","kind":"array","property":"components","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/coordinated_placements.json","pointer":"/properties/components/items/properties/component_id","kind":"string","property":"component_id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"formats/canonical/coordinated_placements.json","pointer":"/properties/components/items/properties/canvas_constraints","kind":"array","property":"canvas_constraints","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canvas-constraint.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/coordinated_placements.json","pointer":"/properties/components/items/properties/format_kind","kind":"string","property":"format_kind","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"formats/canonical/coordinated_placements.json","pointer":"/properties/shared_slots","kind":"array","property":"shared_slots","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/coordinated_placements.json","pointer":"/properties/shared_slots/items/properties/asset_group_id","kind":"string","property":"asset_group_id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9_]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"formats/canonical/coordinated_placements.json","pointer":"/properties/shared_slots/items/properties/consumed_by","kind":"array","property":"consumed_by","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/coordinated_placements.json","pointer":"/properties/shared_slots/items/properties/consumed_by/items","kind":"string","property":"consumed_by","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"formats/canonical/display_tag.json","pointer":"/properties/sizes","kind":"array","property":"sizes","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"formats/canonical/display_tag.json","pointer":"/properties/supported_tag_types","kind":"array","property":"supported_tag_types","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"formats/canonical/display_tag.json","pointer":"/properties/supported_delivery_types","kind":"array","property":"supported_delivery_types","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"formats/canonical/html5.json","pointer":"/properties/sizes","kind":"array","property":"sizes","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"formats/canonical/image.json","pointer":"/properties/sizes","kind":"array","property":"sizes","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"formats/canonical/image.json","pointer":"/properties/pixel_ratios","kind":"array","property":"pixel_ratios","side":"both","stability":"stable","in_last_stable":"yes","items":"number","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/image.json","pointer":"/properties/aspect_ratio","kind":"string","property":"aspect_ratio","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[0-9]+(\\.[0-9]+)?:[0-9]+(\\.[0-9]+)?$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"formats/canonical/image.json","pointer":"/properties/image_formats","kind":"array","property":"image_formats","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"formats/canonical/image.json","pointer":"/properties/cta_values","kind":"array","property":"cta_values","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/image.json","pointer":"/properties/cta_values/items","kind":"string","property":"cta_values","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"formats/canonical/image.json","pointer":"/properties/activation_methods","kind":"array","property":"activation_methods","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/activation-method.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"formats/canonical/image_carousel.json","pointer":"/properties/card_aspect_ratio","kind":"string","property":"card_aspect_ratio","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[0-9]+(\\.[0-9]+)?:[0-9]+(\\.[0-9]+)?$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"formats/canonical/image_carousel.json","pointer":"/properties/allowed_card_media_asset_types","kind":"array","property":"allowed_card_media_asset_types","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"formats/canonical/image_carousel.json","pointer":"/properties/allowed_card_asset_types","kind":"array","property":"allowed_card_asset_types","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"formats/canonical/native_in_feed.json","pointer":"/properties/activation_methods","kind":"array","property":"activation_methods","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/activation-method.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"formats/canonical/native_in_feed.json","pointer":"/properties/cta_values","kind":"array","property":"cta_values","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/native_in_feed.json","pointer":"/properties/cta_values/items","kind":"string","property":"cta_values","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"formats/canonical/native_in_feed.json","pointer":"/properties/main_image_sizes","kind":"array","property":"main_image_sizes","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"formats/canonical/native_in_feed.json","pointer":"/properties/image_formats","kind":"array","property":"image_formats","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"formats/canonical/responsive_creative.json","pointer":"/properties/images_landscape_aspect_ratio","kind":"string","property":"images_landscape_aspect_ratio","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"formats/canonical/responsive_creative.json","pointer":"/properties/logo_aspect_ratios","kind":"array","property":"logo_aspect_ratios","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/responsive_creative.json","pointer":"/properties/logo_aspect_ratios/items","kind":"string","property":"logo_aspect_ratios","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"formats/canonical/seller_rendered_stateful_display.json","pointer":"/properties/states","kind":"array","property":"states","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/seller_rendered_stateful_display.json","pointer":"/properties/states/items/properties/state_id","kind":"string","property":"state_id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"formats/canonical/seller_rendered_stateful_display.json","pointer":"/properties/states/items/properties/slot_bindings","kind":"array","property":"slot_bindings","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/seller_rendered_stateful_display.json","pointer":"/properties/states/items/properties/slot_bindings/items","kind":"string","property":"slot_bindings","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9_]+$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"formats/canonical/seller_rendered_stateful_display.json","pointer":"/properties/states/items/properties/breakpoints","kind":"array","property":"breakpoints","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/seller_rendered_stateful_display.json","pointer":"/properties/states/items/properties/breakpoints/items/properties/breakpoint_id","kind":"string","property":"breakpoint_id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"formats/canonical/seller_rendered_stateful_display.json","pointer":"/properties/states/items/properties/breakpoints/items/properties/canvas_aspect_ratio","kind":"string","property":"canvas_aspect_ratio","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[0-9]+(\\.[0-9]+)?:[0-9]+(\\.[0-9]+)?$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"formats/canonical/seller_rendered_stateful_display.json","pointer":"/properties/initial_state_id","kind":"string","property":"initial_state_id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"formats/canonical/seller_rendered_stateful_display.json","pointer":"/properties/transitions","kind":"array","property":"transitions","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/seller_rendered_stateful_display.json","pointer":"/properties/transitions/items/properties/transition_id","kind":"string","property":"transition_id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"formats/canonical/seller_rendered_stateful_display.json","pointer":"/properties/transitions/items/properties/from_state_id","kind":"string","property":"from_state_id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"formats/canonical/seller_rendered_stateful_display.json","pointer":"/properties/transitions/items/properties/to_state_id","kind":"string","property":"to_state_id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"formats/canonical/seller_rendered_stateful_display.json","pointer":"/properties/canvas_constraints","kind":"array","property":"canvas_constraints","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canvas-constraint.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/seller_rendered_stateful_display.json","pointer":"/properties/aspect_ratio","kind":"string","property":"aspect_ratio","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[0-9]+(\\.[0-9]+)?:[0-9]+(\\.[0-9]+)?$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"formats/canonical/seller_rendered_stateful_display.json","pointer":"/properties/containers","kind":"array","property":"containers","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"formats/canonical/sponsored_placement.json","pointer":"/properties/supported_catalog_types","kind":"array","property":"supported_catalog_types","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/catalog-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (13 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"formats/canonical/sponsored_placement.json","pointer":"/properties/required_catalog_fields","kind":"array","property":"required_catalog_fields","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/sponsored_placement.json","pointer":"/properties/required_catalog_fields/items","kind":"string","property":"required_catalog_fields","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"formats/canonical/sponsored_placement.json","pointer":"/properties/supported_id_types","kind":"array","property":"supported_id_types","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (13 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"formats/canonical/video_hosted.json","pointer":"/properties/aspect_ratio","kind":"string","property":"aspect_ratio","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[0-9]+(\\.[0-9]+)?:[0-9]+(\\.[0-9]+)?$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"formats/canonical/video_hosted.json","pointer":"/properties/video_codecs","kind":"array","property":"video_codecs","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (9 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"formats/canonical/video_hosted.json","pointer":"/properties/audio_codecs","kind":"array","property":"audio_codecs","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"formats/canonical/video_hosted.json","pointer":"/properties/containers","kind":"array","property":"containers","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"formats/canonical/video_hosted.json","pointer":"/properties/frame_rates","kind":"array","property":"frame_rates","side":"both","stability":"stable","in_last_stable":"yes","items":"number","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/video_hosted.json","pointer":"/properties/cta_values","kind":"array","property":"cta_values","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/video_hosted.json","pointer":"/properties/cta_values/items","kind":"string","property":"cta_values","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"formats/canonical/video_hosted.json","pointer":"/properties/companion_banner_widths","kind":"array","property":"companion_banner_widths","side":"both","stability":"stable","in_last_stable":"yes","items":"integer","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/video_hosted.json","pointer":"/properties/companion_banner_heights","kind":"array","property":"companion_banner_heights","side":"both","stability":"stable","in_last_stable":"yes","items":"integer","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"formats/canonical/video_vast.json","pointer":"/properties/aspect_ratio","kind":"string","property":"aspect_ratio","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[0-9]+(\\.[0-9]+)?:[0-9]+(\\.[0-9]+)?$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"formats/canonical/video_vast.json","pointer":"/properties/vast_versions","kind":"array","property":"vast_versions","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/vast-version.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"formats/canonical/video_vast.json","pointer":"/properties/activation_methods","kind":"array","property":"activation_methods","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/activation-method.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"governance/accepted-governance-agents.json","pointer":"/properties/any_of","kind":"array","property":"any_of","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"governance/accepted-governance-agents.json","pointer":"/properties/any_of/items/oneOf/1/properties/role","kind":"string","property":"role","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_-]*$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"governance/accepted-governance-agents.json","pointer":"/properties/any_of/items/oneOf/1/properties/adcp_version","kind":"string","property":"adcp_version","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)$","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"governance/accepted-governance-agents.json","pointer":"/properties/any_of/items/oneOf/1/properties/verification_modes","kind":"array","property":"verification_modes","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"governance/attribute-definition.json","pointer":"/properties/attribute_id","kind":"string","property":"attribute_id","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"governance/attribute-definition.json","pointer":"/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"governance/attribute-definition.json","pointer":"/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"governance/attribute-definition.json","pointer":"/properties/regulatory_basis","kind":"array","property":"regulatory_basis","side":"other","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"governance/attribute-definition.json","pointer":"/properties/regulatory_basis/items/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"governance/attribute-definition.json","pointer":"/properties/regulatory_basis/items/properties/jurisdictions","kind":"array","property":"jurisdictions","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"governance/attribute-definition.json","pointer":"/properties/regulatory_basis/items/properties/jurisdictions/items","kind":"string","property":"jurisdictions","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"governance/attribute-definition.json","pointer":"/properties/regulatory_basis/items/properties/summary","kind":"string","property":"summary","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"governance/attribute-definition.json","pointer":"/properties/includes","kind":"array","property":"includes","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"governance/attribute-definition.json","pointer":"/properties/includes/items","kind":"string","property":"includes","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"governance/attribute-definition.json","pointer":"/properties/excludes","kind":"array","property":"excludes","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"governance/attribute-definition.json","pointer":"/properties/excludes/items","kind":"string","property":"excludes","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"governance/attribute-definition.json","pointer":"/properties/signal_patterns","kind":"array","property":"signal_patterns","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"governance/attribute-definition.json","pointer":"/properties/signal_patterns/items","kind":"string","property":"signal_patterns","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"governance/attribute-definition.json","pointer":"/properties/guidance","kind":"string","property":"guidance","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"governance/audience-constraints.json","pointer":"/properties/include","kind":"array","property":"include","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/audience-selector.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"governance/audience-constraints.json","pointer":"/properties/exclude","kind":"array","property":"exclude","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/audience-selector.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"governance/policy-category-definition.json","pointer":"/properties/category_id","kind":"string","property":"category_id","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"governance/policy-category-definition.json","pointer":"/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"governance/policy-category-definition.json","pointer":"/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"governance/policy-category-definition.json","pointer":"/properties/facets","kind":"array","property":"facets","side":"other","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"governance/policy-category-definition.json","pointer":"/properties/facets/items/properties/facet_id","kind":"string","property":"facet_id","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"governance/policy-category-definition.json","pointer":"/properties/facets/items/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"governance/policy-category-definition.json","pointer":"/properties/facets/items/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"governance/policy-category-definition.json","pointer":"/properties/regulatory_frameworks","kind":"array","property":"regulatory_frameworks","side":"other","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"governance/policy-category-definition.json","pointer":"/properties/regulatory_frameworks/items/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"governance/policy-category-definition.json","pointer":"/properties/regulatory_frameworks/items/properties/jurisdictions","kind":"array","property":"jurisdictions","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"governance/policy-category-definition.json","pointer":"/properties/regulatory_frameworks/items/properties/jurisdictions/items","kind":"string","property":"jurisdictions","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"governance/policy-category-definition.json","pointer":"/properties/regulatory_frameworks/items/properties/summary","kind":"string","property":"summary","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"governance/policy-category-definition.json","pointer":"/properties/regulatory_frameworks/items/properties/policy_ids","kind":"array","property":"policy_ids","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"governance/policy-category-definition.json","pointer":"/properties/regulatory_frameworks/items/properties/policy_ids/items","kind":"string","property":"policy_ids","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"governance/policy-category-definition.json","pointer":"/properties/restricted_attributes","kind":"array","property":"restricted_attributes","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/restricted-attribute.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (11 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"governance/policy-category-definition.json","pointer":"/properties/industries","kind":"array","property":"industries","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"governance/policy-category-definition.json","pointer":"/properties/industries/items","kind":"string","property":"industries","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"governance/policy-category-definition.json","pointer":"/properties/guidance","kind":"string","property":"guidance","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"governance/policy-category-definition.json","pointer":"/properties/related_categories","kind":"array","property":"related_categories","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"governance/policy-category-definition.json","pointer":"/properties/related_categories/items","kind":"string","property":"related_categories","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"governance/policy-entry.json","pointer":"/properties/policy_id","kind":"string","property":"policy_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"governance/policy-entry.json","pointer":"/properties/version","kind":"string","property":"version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"governance/policy-entry.json","pointer":"/properties/name","kind":"string","property":"name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"governance/policy-entry.json","pointer":"/properties/jurisdictions","kind":"array","property":"jurisdictions","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"governance/policy-entry.json","pointer":"/properties/jurisdictions/items","kind":"string","property":"jurisdictions","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"governance/policy-entry.json","pointer":"/properties/region_aliases/additionalProperties","kind":"array","property":"region_aliases","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"governance/policy-entry.json","pointer":"/properties/region_aliases/additionalProperties/items","kind":"string","property":"region_aliases","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"governance/policy-entry.json","pointer":"/properties/policy_categories","kind":"array","property":"policy_categories","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"governance/policy-entry.json","pointer":"/properties/policy_categories/items","kind":"string","property":"policy_categories","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"governance/policy-entry.json","pointer":"/properties/channels","kind":"array","property":"channels","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/channels.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (20 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"governance/policy-entry.json","pointer":"/properties/governance_domains","kind":"array","property":"governance_domains","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/governance-domain.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"governance/policy-entry.json","pointer":"/properties/source_name","kind":"string","property":"source_name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"governance/policy-entry.json","pointer":"/properties/issuer/properties/domain","kind":"string","property":"domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z]{2,63}$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"governance/policy-entry.json","pointer":"/properties/issuer/properties/name","kind":"string","property":"name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"governance/policy-entry.json","pointer":"/properties/guidance","kind":"string","property":"guidance","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"governance/policy-entry.json","pointer":"/properties/exemplars/properties/pass","kind":"array","property":"pass","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref #/$defs/exemplar","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"governance/policy-entry.json","pointer":"/properties/exemplars/properties/fail","kind":"array","property":"fail","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref #/$defs/exemplar","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"governance/policy-entry.json","pointer":"/$defs/exemplar/properties/scenario","kind":"string","property":"scenario","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"governance/policy-entry.json","pointer":"/$defs/exemplar/properties/explanation","kind":"string","property":"explanation","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"governance/policy-ref.json","pointer":"/properties/policy_id","kind":"string","property":"policy_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"governance/policy-ref.json","pointer":"/properties/version","kind":"string","property":"version","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"manifest.schema.json","pointer":"/properties/$schema","kind":"string","property":"$schema","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2048,"tier":"string-url","rationale":"JSON Schema URI.","action":"tighten in 4.0"}, + {"file":"manifest.schema.json","pointer":"/properties/adcp_version","kind":"string","property":"adcp_version","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^\\d+\\.\\d+\\.\\d+(-[A-Za-z0-9.-]+)?$","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"manifest.schema.json","pointer":"/properties/tools/additionalProperties/properties/operation_family","kind":"string","property":"operation_family","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"manifest.schema.json","pointer":"/properties/tools/additionalProperties/properties/async_response_schemas","kind":"array","property":"async_response_schemas","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/schema_path","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"manifest.schema.json","pointer":"/properties/tools/additionalProperties/properties/superseded_by","kind":"array","property":"superseded_by","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/tool_name","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"manifest.schema.json","pointer":"/properties/tools/additionalProperties/properties/specialisms","kind":"array","property":"specialisms","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"manifest.schema.json","pointer":"/properties/tools/additionalProperties/properties/specialisms/items","kind":"string","property":"specialisms","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"manifest.schema.json","pointer":"/properties/tools/additionalProperties/properties/added_in","kind":"string","property":"added_in","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"manifest.schema.json","pointer":"/properties/tools/additionalProperties/properties/deprecated_in","kind":"string","property":"deprecated_in","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"manifest.schema.json","pointer":"/properties/error_code_policy/properties/note","kind":"string","property":"note","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"manifest.schema.json","pointer":"/properties/error_codes/additionalProperties/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"manifest.schema.json","pointer":"/properties/error_codes/additionalProperties/properties/suggestion","kind":"string","property":"suggestion","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"manifest.schema.json","pointer":"/properties/error_codes/additionalProperties/properties/added_in","kind":"string","property":"added_in","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"manifest.schema.json","pointer":"/properties/specialisms/additionalProperties/properties/protocol","kind":"string","property":"protocol","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"manifest.schema.json","pointer":"/properties/specialisms/additionalProperties/properties/title","kind":"string","property":"title","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"manifest.schema.json","pointer":"/properties/specialisms/additionalProperties/properties/entry_point_tools","kind":"array","property":"entry_point_tools","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"manifest.schema.json","pointer":"/properties/specialisms/additionalProperties/properties/entry_point_tools/items","kind":"string","property":"entry_point_tools","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"manifest.schema.json","pointer":"/properties/specialisms/additionalProperties/properties/exercised_tools","kind":"array","property":"exercised_tools","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"manifest.schema.json","pointer":"/properties/specialisms/additionalProperties/properties/exercised_tools/items","kind":"string","property":"exercised_tools","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"manifest.schema.json","pointer":"/definitions/tool_name","kind":"string","property":"tool_name","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"manifest.schema.json","pointer":"/definitions/schema_path","kind":"string","property":"schema_path","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[A-Za-z0-9_-]+(?:/[A-Za-z0-9_-]+)*\\.json$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"media-buy/accept-proposal-request.json","pointer":"/properties/proposal_id","kind":"string","property":"proposal_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/accept-proposal-request.json","pointer":"/properties/budget_cap_timezone","kind":"string","property":"budget_cap_timezone","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/accept-proposal-request.json","pointer":"/properties/io_acceptance/properties/io_id","kind":"string","property":"io_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/accept-proposal-request.json","pointer":"/properties/io_acceptance/properties/signature_id","kind":"string","property":"signature_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-context.json","pointer":"/properties/subjects","kind":"array","property":"subjects","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-context.json","pointer":"/properties/subjects/items/properties/subject_category","kind":"string","property":"subject_category","side":"request","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-context.json","pointer":"/properties/subjects/items/properties/subject_facets","kind":"array","property":"subject_facets","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-context.json","pointer":"/properties/subjects/items/properties/subject_facets/items","kind":"string","property":"subject_facets","side":"request","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-context.json","pointer":"/properties/advertiser_roles","kind":"array","property":"advertiser_roles","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-context.json","pointer":"/properties/advertiser_roles/items","kind":"string","property":"advertiser_roles","side":"request","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-context.json","pointer":"/properties/advertiser_jurisdictions","kind":"array","property":"advertiser_jurisdictions","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-context.json","pointer":"/properties/delivery_jurisdictions","kind":"array","property":"delivery_jurisdictions","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-catalog.json","pointer":"/properties/catalog_version","kind":"string","property":"catalog_version","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-catalog.json","pointer":"/properties/profiles","kind":"array","property":"profiles","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/media-buy/acceptance-policy-profile.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-catalog.json","pointer":"/properties/registry_profiles","kind":"array","property":"registry_profiles","side":"other","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/media-buy/acceptance-policy-profile-ref.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-profile-ref.json","pointer":"/properties/policy_id","kind":"string","property":"policy_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-profile-ref.json","pointer":"/properties/policy_version","kind":"string","property":"policy_version","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-profile-ref.json","pointer":"/properties/profile_id","kind":"string","property":"profile_id","side":"other","stability":"stable","in_last_stable":"yes","pattern":"^[A-Za-z0-9_.:-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-profile-ref.json","pointer":"/properties/profile_version","kind":"string","property":"profile_version","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-profile.json","pointer":"/properties/profile_id","kind":"string","property":"profile_id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[A-Za-z0-9_.:-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-profile.json","pointer":"/properties/version","kind":"string","property":"version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-profile.json","pointer":"/properties/policy_refs","kind":"array","property":"policy_refs","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-profile.json","pointer":"/properties/policy_refs/items/properties/policy_id","kind":"string","property":"policy_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-profile.json","pointer":"/properties/policy_refs/items/properties/version","kind":"string","property":"version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-profile.json","pointer":"/properties/scope/properties/subject_categories","kind":"array","property":"subject_categories","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-profile.json","pointer":"/properties/scope/properties/subject_categories/items","kind":"string","property":"subject_categories","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-profile.json","pointer":"/properties/scope/properties/applies_to","kind":"array","property":"applies_to","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-profile.json","pointer":"/properties/scope/properties/jurisdictions","kind":"array","property":"jurisdictions","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-profile.json","pointer":"/properties/scope/properties/jurisdiction_groups","kind":"array","property":"jurisdiction_groups","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-profile.json","pointer":"/properties/scope/properties/jurisdiction_groups/items","kind":"string","property":"jurisdiction_groups","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[A-Z][A-Z0-9_-]*$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-profile.json","pointer":"/properties/region_aliases/additionalProperties","kind":"array","property":"region_aliases","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-profile.json","pointer":"/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-profile.json","pointer":"/properties/rules","kind":"array","property":"rules","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/media-buy/acceptance-policy-rule.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/0/properties/declaration","kind":"string","property":"declaration","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/0/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/1/properties/verification_scheme","kind":"string","property":"verification_scheme","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/1/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/2/properties/criteria","kind":"array","property":"criteria","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/2/properties/criteria/items","kind":"string","property":"criteria","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_.:-]*$","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/2/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/3/properties/criteria","kind":"array","property":"criteria","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/3/properties/criteria/items","kind":"string","property":"criteria","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_.:-]*$","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/3/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/4/properties/credential","kind":"string","property":"credential","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/4/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/5/properties/credential","kind":"string","property":"credential","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/5/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/6/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/7/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/8/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/9/properties/format","kind":"string","property":"format","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/9/properties/placement","kind":"string","property":"placement","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/9/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/10/properties/restricted_attributes","kind":"array","property":"restricted_attributes","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/restricted-attribute.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (11 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/10/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/11/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/12/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/13/properties/format_ids","kind":"array","property":"format_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/13/properties/format_ids/items","kind":"string","property":"format_ids","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/13/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/14/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/15/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/16/properties/id","kind":"string","property":"id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_.:-]*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-requirement.json","pointer":"/oneOf/16/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-rule.json","pointer":"/properties/rule_id","kind":"string","property":"rule_id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[A-Za-z0-9_.:-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-rule.json","pointer":"/properties/subject_category","kind":"string","property":"subject_category","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-rule.json","pointer":"/properties/subject_facets","kind":"array","property":"subject_facets","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-rule.json","pointer":"/properties/subject_facets/items","kind":"string","property":"subject_facets","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-rule.json","pointer":"/properties/advertiser_roles","kind":"array","property":"advertiser_roles","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-rule.json","pointer":"/properties/advertiser_roles/items","kind":"string","property":"advertiser_roles","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-rule.json","pointer":"/properties/jurisdictions","kind":"array","property":"jurisdictions","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-rule.json","pointer":"/properties/jurisdiction_groups","kind":"array","property":"jurisdiction_groups","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-rule.json","pointer":"/properties/jurisdiction_groups/items","kind":"string","property":"jurisdiction_groups","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[A-Z][A-Z0-9_-]*$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-rule.json","pointer":"/properties/applies_to","kind":"array","property":"applies_to","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-rule.json","pointer":"/properties/requirements","kind":"array","property":"requirements","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/media-buy/acceptance-policy-requirement.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-rule.json","pointer":"/properties/policy_ids","kind":"array","property":"policy_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"media-buy/acceptance-policy-rule.json","pointer":"/properties/policy_ids/items","kind":"string","property":"policy_ids","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-async-response-input-required.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-async-response-submitted.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-async-response-working.json","pointer":"/properties/current_step","kind":"string","property":"current_step","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-request.json","pointer":"/properties/message","kind":"string","property":"message","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-request.json","pointer":"/properties/creative_id","kind":"string","property":"creative_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-request.json","pointer":"/properties/concept_id","kind":"string","property":"concept_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-request.json","pointer":"/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-request.json","pointer":"/properties/package_id","kind":"string","property":"package_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-request.json","pointer":"/properties/target_capability_id","kind":"string","property":"target_capability_id","side":"request","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-request.json","pointer":"/properties/target_capability_ids/items","kind":"string","property":"target_capability_ids","side":"request","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-request.json","pointer":"/properties/transformer_id","kind":"string","property":"transformer_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-request.json","pointer":"/properties/refine_from_build_variant_id","kind":"string","property":"refine_from_build_variant_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-request.json","pointer":"/properties/variant_axis/properties/field","kind":"string","property":"field","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-request.json","pointer":"/properties/variant_axis/properties/values","kind":"array","property":"values","side":"request","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-request.json","pointer":"/properties/variant_axis/properties/label","kind":"string","property":"label","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-request.json","pointer":"/properties/preview_inputs","kind":"array","property":"preview_inputs","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-request.json","pointer":"/properties/preview_inputs/items/properties/name","kind":"string","property":"name","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-request.json","pointer":"/properties/preview_inputs/items/properties/macros/additionalProperties","kind":"string","property":"macros","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-request.json","pointer":"/properties/preview_inputs/items/properties/context_description","kind":"string","property":"context_description","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-request.json","pointer":"/properties/macro_values/additionalProperties","kind":"string","property":"macro_values","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/0/properties/build_variant_id","kind":"string","property":"build_variant_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/0/properties/recipe_hash","kind":"string","property":"recipe_hash","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/0/properties/preview/properties/previews","kind":"array","property":"previews","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/0/properties/preview/properties/previews/items/properties/preview_id","kind":"string","property":"preview_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/0/properties/preview/properties/previews/items/properties/renders","kind":"array","property":"renders","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/creative/preview-render.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/0/properties/preview/properties/previews/items/properties/input/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/0/properties/preview/properties/previews/items/properties/input/properties/macros/additionalProperties","kind":"string","property":"macros","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/0/properties/preview/properties/previews/items/properties/input/properties/context_description","kind":"string","property":"context_description","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/0/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/0/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","added_in_3_3":true,"in_last_stable":"unknown","marker_conflict":true,"items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/1/properties/creative_manifests","kind":"array","property":"creative_manifests","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/creative-manifest.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/1/properties/preview/properties/previews","kind":"array","property":"previews","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/1/properties/preview/properties/previews/items/properties/preview_id","kind":"string","property":"preview_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/1/properties/preview/properties/previews/items/properties/capability_id","kind":"string","property":"capability_id","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/1/properties/preview/properties/previews/items/properties/renders","kind":"array","property":"renders","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/creative/preview-render.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/1/properties/preview/properties/previews/items/properties/input/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/1/properties/preview/properties/previews/items/properties/input/properties/macros/additionalProperties","kind":"string","property":"macros","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/1/properties/preview/properties/previews/items/properties/input/properties/context_description","kind":"string","property":"context_description","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/1/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","added_in_3_3":true,"in_last_stable":"unknown","marker_conflict":true,"items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/2/properties/creatives","kind":"array","property":"creatives","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/2/properties/creatives/items/properties/build_creative_id","kind":"string","property":"build_creative_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/2/properties/creatives/items/properties/catalog_item_ref/properties/catalog_type","kind":"string","property":"catalog_type","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/2/properties/creatives/items/properties/catalog_item_ref/properties/item_id","kind":"string","property":"item_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/2/properties/creatives/items/properties/variants","kind":"array","property":"variants","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/2/properties/creatives/items/properties/variants/items/properties/build_variant_id","kind":"string","property":"build_variant_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/2/properties/creatives/items/properties/variants/items/properties/recipe_hash","kind":"string","property":"recipe_hash","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/2/properties/creatives/items/properties/variants/items/properties/parent_build_variant_id","kind":"string","property":"parent_build_variant_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/2/properties/creatives/items/properties/variants/items/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/2/properties/creatives/items/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/2/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/3/properties/estimate/properties/per_leaf","kind":"array","property":"per_leaf","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/3/properties/estimate/properties/per_leaf/items/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/4/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/build-creative-response.json","pointer":"/oneOf/5/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/buy-products-request.json","pointer":"/properties/feed_version","kind":"string","property":"feed_version","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/buy-products-request.json","pointer":"/properties/pricing_version","kind":"string","property":"pricing_version","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/buy-products-request.json","pointer":"/properties/purchases","kind":"array","property":"purchases","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/media-buy/product-purchase-input.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/buy-products-request.json","pointer":"/properties/budget_cap_timezone","kind":"string","property":"budget_cap_timezone","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"media-buy/change-term.json","pointer":"/properties/term_id","kind":"string","property":"term_id","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[A-Za-z0-9_.:-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/change-term.json","pointer":"/properties/allowed_statuses","kind":"array","property":"allowed_statuses","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/change-term.json","pointer":"/properties/conditions","kind":"array","property":"conditions","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/commercial-terms.json","pointer":"/properties/source_feed_version","kind":"string","property":"source_feed_version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/commercial-terms.json","pointer":"/properties/source_pricing_version","kind":"string","property":"source_pricing_version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/commercial-terms.json","pointer":"/properties/purchases","kind":"array","property":"purchases","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/commercial-terms.json","pointer":"/properties/budget_cap_timezone","kind":"string","property":"budget_cap_timezone","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/commercial-terms.json","pointer":"/properties/reporting_commitments","kind":"array","property":"reporting_commitments","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/commercial-terms.json","pointer":"/properties/reporting_commitments/items/properties/metrics","kind":"array","property":"metrics","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-reporting-commitment.json","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"media-buy/commercial-terms.json","pointer":"/properties/change_terms","kind":"array","property":"change_terms","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/media-buy/change-term.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/control-media-buy-request.json","pointer":"/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/control-media-buy-request.json","pointer":"/properties/budget_cap_timezone","kind":"string","property":"budget_cap_timezone","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/control-media-buy-request.json","pointer":"/properties/packages","kind":"array","property":"packages","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/media-buy/package-control.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/control-media-buy-response.json","pointer":"/oneOf/0/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/control-media-buy-response.json","pointer":"/oneOf/0/properties/affected_package_ids","kind":"array","property":"affected_package_ids","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"media-buy/control-media-buy-response.json","pointer":"/oneOf/0/properties/affected_package_ids/items","kind":"string","property":"affected_package_ids","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/control-media-buy-response.json","pointer":"/oneOf/0/properties/available_actions","kind":"array","property":"available_actions","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-media-buy-action.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/control-media-buy-response.json","pointer":"/oneOf/0/properties/warnings","kind":"array","property":"warnings","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/control-media-buy-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/control-media-buy-response.json","pointer":"/oneOf/2/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/create-media-buy-async-response-input-required.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/create-media-buy-async-response-submitted.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/create-media-buy-async-response-working.json","pointer":"/properties/current_step","kind":"string","property":"current_step","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/create-media-buy-request.json","pointer":"/properties/plan_id","kind":"string","property":"plan_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/create-media-buy-request.json","pointer":"/properties/proposal_id","kind":"string","property":"proposal_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/create-media-buy-request.json","pointer":"/properties/budget_cap_timezone","kind":"string","property":"budget_cap_timezone","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/create-media-buy-request.json","pointer":"/properties/packages","kind":"array","property":"packages","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/media-buy/package-request.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/create-media-buy-request.json","pointer":"/properties/io_acceptance/properties/io_id","kind":"string","property":"io_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/create-media-buy-request.json","pointer":"/properties/io_acceptance/properties/signature_id","kind":"string","property":"signature_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/create-media-buy-request.json","pointer":"/properties/po_number","kind":"string","property":"po_number","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/create-media-buy-request.json","pointer":"/properties/artifact_webhook/properties/token","kind":"string","property":"token","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"media-buy/create-media-buy-request.json","pointer":"/properties/artifact_webhook/properties/authentication/properties/credentials","kind":"string","property":"credentials","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"media-buy/create-media-buy-response.json","pointer":"/oneOf/0/properties/proposal_id","kind":"string","property":"proposal_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/create-media-buy-response.json","pointer":"/oneOf/0/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/create-media-buy-response.json","pointer":"/oneOf/0/properties/budget_cap_timezone","kind":"string","property":"budget_cap_timezone","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"media-buy/create-media-buy-response.json","pointer":"/oneOf/0/properties/valid_actions","kind":"array","property":"valid_actions","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/media-buy-valid-action.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (24 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/create-media-buy-response.json","pointer":"/oneOf/0/properties/available_actions","kind":"array","property":"available_actions","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/media-buy-available-action.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/create-media-buy-response.json","pointer":"/oneOf/0/properties/packages","kind":"array","property":"packages","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/package.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/create-media-buy-response.json","pointer":"/oneOf/0/properties/warnings","kind":"array","property":"warnings","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/warning.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/create-media-buy-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/create-media-buy-response.json","pointer":"/oneOf/2/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/decline-proposals-request.json","pointer":"/properties/context_id","kind":"string","property":"context_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/decline-proposals-response.json","pointer":"/properties/results","kind":"array","property":"results","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/decline-proposals-response.json","pointer":"/properties/results/items/properties/proposal_id","kind":"string","property":"proposal_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/decline-proposals-response.json","pointer":"/properties/results/items/properties/reason","kind":"string","property":"reason","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/decline-proposals-response.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-request.json","pointer":"/properties/media_buy_ids","kind":"array","property":"media_buy_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-request.json","pointer":"/properties/media_buy_ids/items","kind":"string","property":"media_buy_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-request.json","pointer":"/properties/status_filter/oneOf/1","kind":"array","property":"status_filter","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/media-buy-status.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-request.json","pointer":"/properties/requested_metrics","kind":"array","property":"requested_metrics","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/available-metric.json","proposed_limit":51,"tier":"array-enum","rationale":"Enum-valued items (51 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-request.json","pointer":"/properties/reporting_dimensions/properties/device_type/properties/cursor","kind":"string","property":"cursor","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-request.json","pointer":"/properties/reporting_dimensions/properties/device_platform/properties/cursor","kind":"string","property":"cursor","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-request.json","pointer":"/properties/reporting_dimensions/properties/audience/properties/cursor","kind":"string","property":"cursor","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-request.json","pointer":"/properties/reporting_dimensions/properties/demographic/properties/age_ranges","kind":"array","property":"age_ranges","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/demographic-age-range.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-request.json","pointer":"/properties/reporting_dimensions/properties/placement/properties/cursor","kind":"string","property":"cursor","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/reporting_period/properties/timezone","kind":"string","property":"timezone","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/reporting_revision_binding/properties/control_totals","kind":"array","property":"control_totals","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/reporting-control-total.json","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/reporting_rows","kind":"array","property":"reporting_rows","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":10000,"tier":"array-catalog","rationale":"Catalog-scale payload; matches the 10,000 ceiling already used for records and events.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/aggregated_totals/properties/metric_aggregates","kind":"array","property":"metric_aggregates","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/delivery-metric-aggregate.json","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries","kind":"array","property":"media_buy_deliveries","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package","kind":"array","property":"by_package","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/package_id","kind":"string","property":"package_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/missing_metrics","kind":"array","property":"missing_metrics","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/missing-metric.json","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/metric_values","kind":"array","property":"metric_values","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/package-delivery-metric-value.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_catalog_item","kind":"array","property":"by_catalog_item","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/catalog-item-delivery-metrics.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_creative","kind":"array","property":"by_creative","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/creative-delivery-metrics.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_format","kind":"array","property":"by_format","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_keyword","kind":"array","property":"by_keyword","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/keyword-delivery-metrics.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_geo","kind":"array","property":"by_geo","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/geo-delivery-metrics.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_device_type","kind":"array","property":"by_device_type","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_device_platform","kind":"array","property":"by_device_platform","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_audience","kind":"array","property":"by_audience","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_audience/items/allOf/1/properties/audience_id","kind":"string","property":"audience_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_audience/items/allOf/1/properties/audience_name","kind":"string","property":"audience_name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_demographic","kind":"array","property":"by_demographic","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_demographic/items/allOf/1/properties/demographic","kind":"string","property":"demographic","side":"response","stability":"stable","in_last_stable":"yes","pattern":"\\S","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_placement","kind":"array","property":"by_placement","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/placement-delivery-metrics.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_property","kind":"array","property":"by_property","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/property-delivery-metrics.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_collection","kind":"array","property":"by_collection","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/collection-delivery-metrics.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_installment","kind":"array","property":"by_installment","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/installment-delivery-metrics.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_collection_property","kind":"array","property":"by_collection_property","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/collection-property-delivery-metrics.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_installment_property","kind":"array","property":"by_installment_property","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/installment-property-delivery-metrics.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_placement_property","kind":"array","property":"by_placement_property","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/placement-property-delivery-metrics.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_spot","kind":"array","property":"by_spot","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_spot/items/allOf/1/properties/spot_id","kind":"string","property":"spot_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_spot/items/allOf/1/properties/creative_id","kind":"string","property":"creative_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_spot/items/allOf/1/properties/network","kind":"string","property":"network","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_spot/items/allOf/1/properties/station","kind":"string","property":"station","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/by_spot/items/allOf/1/properties/daypart","kind":"string","property":"daypart","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/daily_breakdown","kind":"array","property":"daily_breakdown","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/windows","kind":"array","property":"windows","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/windows/items/properties/by_package","kind":"array","property":"by_package","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/windows/items/properties/by_package/items/allOf/1/properties/package_id","kind":"string","property":"package_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/media_buy_deliveries/items/properties/daily_breakdown","kind":"array","property":"daily_breakdown","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buy-delivery-response.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-request.json","pointer":"/properties/media_buy_ids","kind":"array","property":"media_buy_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-request.json","pointer":"/properties/media_buy_ids/items","kind":"string","property":"media_buy_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-request.json","pointer":"/properties/status_filter/oneOf/1","kind":"array","property":"status_filter","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/media-buy-status.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-request.json","pointer":"/properties/indicator_types","kind":"array","property":"indicator_types","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/indicator-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (9 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys","kind":"array","property":"media_buys","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/accepted_proposal/allOf/1/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/impairments","kind":"array","property":"impairments","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/impairment.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/rejection_reason","kind":"string","property":"rejection_reason","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/budget_cap_timezone","kind":"string","property":"budget_cap_timezone","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/valid_actions","kind":"array","property":"valid_actions","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/media-buy-valid-action.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (24 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/available_actions","kind":"array","property":"available_actions","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/history","kind":"array","property":"history","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/history/items/properties/actor","kind":"string","property":"actor","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/history/items/properties/action","kind":"string","property":"action","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Action name.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/history/items/properties/package_id","kind":"string","property":"package_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/packages","kind":"array","property":"packages","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/packages/items/properties/package_id","kind":"string","property":"package_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/packages/items/properties/product_id","kind":"string","property":"product_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/packages/items/properties/optimization_goals","kind":"array","property":"optimization_goals","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/optimization-goal.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/packages/items/properties/format_ids","kind":"array","property":"format_ids","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/packages/items/properties/format_option_refs","kind":"array","property":"format_option_refs","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-option-ref.json","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/packages/items/properties/creative_approvals","kind":"array","property":"creative_approvals","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/packages/items/properties/creative_approvals/items/properties/creative_id","kind":"string","property":"creative_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/packages/items/properties/creative_approvals/items/properties/rejection_reason","kind":"string","property":"rejection_reason","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/packages/items/properties/creative_approvals/items/properties/approval_scopes","kind":"array","property":"approval_scopes","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/creative-approval-scope.json","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/packages/items/properties/creative_approvals/items/properties/indicators","kind":"array","property":"indicators","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/indicator.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/packages/items/properties/creative_approvals/items/properties/indicator_types_evaluated","kind":"array","property":"indicator_types_evaluated","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/indicator-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (9 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/packages/items/properties/creative_approvals/items/properties/indicators_evaluated_scope","kind":"array","property":"indicators_evaluated_scope","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/indicator-scope.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/packages/items/properties/formats_to_provide","kind":"array","property":"formats_to_provide","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/package-format-snapshot.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/packages/items/properties/formats_pending","kind":"array","property":"formats_pending","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/package-format-snapshot.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/packages/items/properties/format_ids_to_provide","kind":"array","property":"format_ids_to_provide","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/media_buys/items/properties/packages/items/properties/format_ids_pending","kind":"array","property":"format_ids_pending","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-media-buys-response.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-async-response-input-required.json","pointer":"/properties/partial_results","kind":"array","property":"partial_results","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/product.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-async-response-input-required.json","pointer":"/properties/suggestions","kind":"array","property":"suggestions","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-async-response-input-required.json","pointer":"/properties/suggestions/items","kind":"string","property":"suggestions","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-async-response-submitted.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-async-response-working.json","pointer":"/properties/current_step","kind":"string","property":"current_step","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-request.json","pointer":"/properties/brief","kind":"string","property":"brief","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":100000,"tier":"string-body","rationale":"Long-form body; matches content (100,000) and transcript (200,000) already in the schemas.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-request.json","pointer":"/properties/refine","kind":"array","property":"refine","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-request.json","pointer":"/properties/refine/items/oneOf/0/properties/ask","kind":"string","property":"ask","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-request.json","pointer":"/properties/refine/items/oneOf/1/properties/product_id","kind":"string","property":"product_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-request.json","pointer":"/properties/refine/items/oneOf/1/properties/ask","kind":"string","property":"ask","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-request.json","pointer":"/properties/refine/items/oneOf/2/properties/proposal_id","kind":"string","property":"proposal_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-request.json","pointer":"/properties/refine/items/oneOf/2/properties/ask","kind":"string","property":"ask","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-request.json","pointer":"/properties/preferred_delivery_types","kind":"array","property":"preferred_delivery_types","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/delivery-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-request.json","pointer":"/properties/fields","kind":"array","property":"fields","side":"request","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-request.json","pointer":"/properties/if_wholesale_feed_version","kind":"string","property":"if_wholesale_feed_version","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-request.json","pointer":"/properties/if_pricing_version","kind":"string","property":"if_pricing_version","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-request.json","pointer":"/properties/required_policies","kind":"array","property":"required_policies","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-request.json","pointer":"/properties/required_policies/items","kind":"string","property":"required_policies","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/products","kind":"array","property":"products","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/product.json","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/collections","kind":"array","property":"collections","side":"both","stability":"experimental","added_in_3_3":true,"in_last_stable":"no","items":"$ref /schemas/core/response-collection.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/extensions/patternProperties/^https?:~1~1[^@]+@sha256:[a-f0-9]{64}$/properties/extends","kind":"string","property":"extends","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/extensions/patternProperties/^https?:~1~1[^@]+@sha256:[a-f0-9]{64}$/properties/version","kind":"string","property":"version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/extensions/patternProperties/^https?:~1~1[^@]+@sha256:[a-f0-9]{64}$/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/proposals","kind":"array","property":"proposals","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/proposal.json","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/refinement_applied","kind":"array","property":"refinement_applied","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/refinement_applied/items/oneOf/0/properties/notes","kind":"string","property":"notes","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/refinement_applied/items/oneOf/1/properties/product_id","kind":"string","property":"product_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/refinement_applied/items/oneOf/1/properties/result_product_id","kind":"string","property":"result_product_id","side":"both","stability":"new-3.3","added_in_3_3":true,"in_last_stable":"unknown","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"withdrawn (#8501)"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/refinement_applied/items/oneOf/1/properties/notes","kind":"string","property":"notes","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/refinement_applied/items/oneOf/2/properties/proposal_id","kind":"string","property":"proposal_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/refinement_applied/items/oneOf/2/properties/notes","kind":"string","property":"notes","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/incomplete","kind":"array","property":"incomplete","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/incomplete/items/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/filter_diagnostics/properties/excluded_by/additionalProperties/properties/values","kind":"array","property":"values","side":"both","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/filter_diagnostics/properties/excluded_by/additionalProperties/properties/values/items/oneOf/0","kind":"string","property":"values","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/filter_diagnostics/properties/excluded_by/additionalProperties/properties/notes","kind":"string","property":"notes","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/wholesale_feed_version","kind":"string","property":"wholesale_feed_version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/pricing_version","kind":"string","property":"pricing_version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/get-products-response.json","pointer":"/properties/execution_readiness/properties/version","kind":"string","property":"version","side":"both","stability":"experimental","added_in_3_3":true,"in_last_stable":"no","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"withdrawn (#8501)"}, + {"file":"media-buy/legacy-purchase-continuation-input.json","pointer":"/properties/continuation_token","kind":"string","property":"continuation_token","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"media-buy/legacy-purchase-continuation-input.json","pointer":"/properties/selected_product_ids","kind":"array","property":"selected_product_ids","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"media-buy/legacy-purchase-continuation-input.json","pointer":"/properties/selected_product_ids/items","kind":"string","property":"selected_product_ids","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/legacy-purchase-continuation-input.json","pointer":"/properties/accepted_losses","kind":"array","property":"accepted_losses","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/list-collections-response.json","pointer":"/properties/collections","kind":"array","property":"collections","side":"response","stability":"experimental","in_last_stable":"no","items":"$ref /schemas/core/response-collection.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"media-buy/list-creative-formats-request.json","pointer":"/properties/format_ids","kind":"array","property":"format_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"media-buy/list-creative-formats-request.json","pointer":"/properties/asset_types","kind":"array","property":"asset_types","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/asset-content-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (17 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/list-creative-formats-request.json","pointer":"/properties/name_search","kind":"string","property":"name_search","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/list-creative-formats-request.json","pointer":"/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"request","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"media-buy/list-creative-formats-request.json","pointer":"/properties/disclosure_positions","kind":"array","property":"disclosure_positions","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/disclosure-position.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (8 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/list-creative-formats-request.json","pointer":"/properties/disclosure_persistence","kind":"array","property":"disclosure_persistence","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/disclosure-persistence.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/list-creative-formats-request.json","pointer":"/properties/output_format_ids","kind":"array","property":"output_format_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"media-buy/list-creative-formats-request.json","pointer":"/properties/input_format_ids","kind":"array","property":"input_format_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"media-buy/list-creative-formats-response.json","pointer":"/properties/formats","kind":"array","property":"formats","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format.json","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"media-buy/list-creative-formats-response.json","pointer":"/properties/creative_agents","kind":"array","property":"creative_agents","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"media-buy/list-creative-formats-response.json","pointer":"/properties/creative_agents/items/properties/agent_name","kind":"string","property":"agent_name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/list-creative-formats-response.json","pointer":"/properties/creative_agents/items/properties/capabilities","kind":"array","property":"capabilities","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/creative-agent-capability.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/list-creative-formats-response.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/list-products-request.json","pointer":"/properties/context_id","kind":"string","property":"context_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/list-products-request.json","pointer":"/properties/cursor","kind":"string","property":"cursor","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"media-buy/list-products-request.json","pointer":"/properties/if_feed_version","kind":"string","property":"if_feed_version","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/list-products-request.json","pointer":"/properties/if_pricing_version","kind":"string","property":"if_pricing_version","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/list-products-response.json","pointer":"/properties/products","kind":"array","property":"products","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-product.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/list-products-response.json","pointer":"/properties/collections","kind":"array","property":"collections","side":"response","stability":"experimental","added_in_3_3":true,"in_last_stable":"no","items":"$ref /schemas/core/response-collection.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"media-buy/list-products-response.json","pointer":"/properties/next_cursor","kind":"string","property":"next_cursor","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"media-buy/list-products-response.json","pointer":"/properties/feed_version","kind":"string","property":"feed_version","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/list-products-response.json","pointer":"/properties/pricing_version","kind":"string","property":"pricing_version","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/list-products-response.json","pointer":"/properties/incomplete","kind":"array","property":"incomplete","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/list-products-response.json","pointer":"/properties/incomplete/items/properties/description","kind":"string","property":"description","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/log-event-request.json","pointer":"/properties/event_source_id","kind":"string","property":"event_source_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/log-event-request.json","pointer":"/properties/test_event_code","kind":"string","property":"test_event_code","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/log-event-response.json","pointer":"/oneOf/0/properties/partial_failures","kind":"array","property":"partial_failures","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/log-event-response.json","pointer":"/oneOf/0/properties/partial_failures/items/properties/event_id","kind":"string","property":"event_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/log-event-response.json","pointer":"/oneOf/0/properties/partial_failures/items/properties/code","kind":"string","property":"code","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/log-event-response.json","pointer":"/oneOf/0/properties/partial_failures/items/properties/message","kind":"string","property":"message","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/log-event-response.json","pointer":"/oneOf/0/properties/warnings","kind":"array","property":"warnings","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/log-event-response.json","pointer":"/oneOf/0/properties/warnings/items","kind":"string","property":"warnings","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/log-event-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/media-buy-commitment-response.json","pointer":"/oneOf/0/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/media-buy-commitment-response.json","pointer":"/oneOf/0/properties/accepted_proposal/allOf/1/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/media-buy-commitment-response.json","pointer":"/oneOf/0/properties/purchase_bindings","kind":"array","property":"purchase_bindings","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/media-buy-commitment-response.json","pointer":"/oneOf/0/properties/purchase_bindings/items/properties/product_id","kind":"string","property":"product_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/media-buy-commitment-response.json","pointer":"/oneOf/0/properties/purchase_bindings/items/properties/package_id","kind":"string","property":"package_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/media-buy-commitment-response.json","pointer":"/oneOf/0/properties/available_actions","kind":"array","property":"available_actions","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-media-buy-action.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/media-buy-commitment-response.json","pointer":"/oneOf/0/properties/warnings","kind":"array","property":"warnings","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/media-buy-commitment-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/media-buy-commitment-response.json","pointer":"/oneOf/2/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/media-buy-delivery-webhook-result.json","pointer":"/properties/reporting_period/properties/timezone","kind":"string","property":"timezone","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"media-buy/media-buy-delivery-webhook-result.json","pointer":"/properties/media_buy_deliveries","kind":"array","property":"media_buy_deliveries","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/media-buy-delivery-webhook-result.json","pointer":"/properties/media_buy_deliveries/items/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/media-buy-delivery-webhook-result.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package","kind":"array","property":"by_package","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/media-buy-delivery-webhook-result.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/package_id","kind":"string","property":"package_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/media-buy-delivery-webhook-result.json","pointer":"/properties/media_buy_deliveries/items/properties/by_package/items/allOf/1/properties/metric_values","kind":"array","property":"metric_values","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/package-delivery-metric-value.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/media-buy-delivery-webhook-result.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/outcome-target.json","pointer":"/properties/goal/oneOf/1/properties/custom_event_name","kind":"string","property":"custom_event_name","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/package-control.json","pointer":"/properties/package_id","kind":"string","property":"package_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/package-control.json","pointer":"/properties/catalog_ids","kind":"array","property":"catalog_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"media-buy/package-control.json","pointer":"/properties/catalog_ids/items","kind":"string","property":"catalog_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/package-control.json","pointer":"/properties/keyword_targets_add","kind":"array","property":"keyword_targets_add","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/keyword-target.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/package-control.json","pointer":"/properties/keyword_targets_remove","kind":"array","property":"keyword_targets_remove","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/keyword-target.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/package-control.json","pointer":"/properties/negative_keywords_add","kind":"array","property":"negative_keywords_add","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/keyword-target.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/package-control.json","pointer":"/properties/negative_keywords_remove","kind":"array","property":"negative_keywords_remove","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/keyword-target.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/package-control.json","pointer":"/properties/optimization_goals","kind":"array","property":"optimization_goals","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-optimization-goal.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/package-request.json","pointer":"/properties/product_id","kind":"string","property":"product_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/package-request.json","pointer":"/properties/format_ids","kind":"array","property":"format_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-id.json","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"media-buy/package-request.json","pointer":"/properties/format_option_refs","kind":"array","property":"format_option_refs","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-option-ref.json","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"media-buy/package-request.json","pointer":"/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/package-request.json","pointer":"/properties/catalogs","kind":"array","property":"catalogs","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/catalog.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/package-request.json","pointer":"/properties/optimization_goals","kind":"array","property":"optimization_goals","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/optimization-goal.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/package-request.json","pointer":"/properties/audience_evidence_pins","kind":"array","property":"audience_evidence_pins","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/audience-evidence-pin.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/package-request.json","pointer":"/properties/performance_standards","kind":"array","property":"performance_standards","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/performance-standard.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/package-request.json","pointer":"/properties/committed_metrics","kind":"array","property":"committed_metrics","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"media-buy/package-request.json","pointer":"/properties/committed_metrics/items/oneOf/1/properties/methodology_version","kind":"string","property":"methodology_version","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/package-request.json","pointer":"/properties/creative_assignments","kind":"array","property":"creative_assignments","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/creative-assignment.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/package-update.json","pointer":"/properties/package_id","kind":"string","property":"package_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/package-update.json","pointer":"/properties/catalogs","kind":"array","property":"catalogs","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/catalog.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/package-update.json","pointer":"/properties/optimization_goals","kind":"array","property":"optimization_goals","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/optimization-goal.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/package-update.json","pointer":"/properties/keyword_targets_add","kind":"array","property":"keyword_targets_add","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/package-update.json","pointer":"/properties/keyword_targets_add/items/properties/keyword","kind":"string","property":"keyword","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/package-update.json","pointer":"/properties/keyword_targets_remove","kind":"array","property":"keyword_targets_remove","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/package-update.json","pointer":"/properties/keyword_targets_remove/items/properties/keyword","kind":"string","property":"keyword","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/package-update.json","pointer":"/properties/negative_keywords_add","kind":"array","property":"negative_keywords_add","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/package-update.json","pointer":"/properties/negative_keywords_add/items/properties/keyword","kind":"string","property":"keyword","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/package-update.json","pointer":"/properties/negative_keywords_remove","kind":"array","property":"negative_keywords_remove","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/package-update.json","pointer":"/properties/negative_keywords_remove/items/properties/keyword","kind":"string","property":"keyword","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/package-update.json","pointer":"/properties/creative_assignments","kind":"array","property":"creative_assignments","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/creative-assignment.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/product-discovery-criteria.json","pointer":"/properties/product_ids","kind":"array","property":"product_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"media-buy/product-discovery-criteria.json","pointer":"/properties/product_ids/items","kind":"string","property":"product_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/product-discovery-criteria.json","pointer":"/properties/policy_ids","kind":"array","property":"policy_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"media-buy/product-discovery-criteria.json","pointer":"/properties/policy_ids/items","kind":"string","property":"policy_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/product-fields.json","pointer":"","kind":"array","property":"","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":40,"tier":"array-enum","rationale":"Enum-valued items (40 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/product-purchase.json","pointer":"/properties/product_id","kind":"string","property":"product_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/product-purchase.json","pointer":"/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/product-purchase.json","pointer":"/properties/format_option_refs","kind":"array","property":"format_option_refs","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/format-option-ref.json","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"media-buy/product-purchase.json","pointer":"/properties/catalog_ids","kind":"array","property":"catalog_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"media-buy/product-purchase.json","pointer":"/properties/catalog_ids/items","kind":"string","property":"catalog_ids","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/product-purchase.json","pointer":"/properties/optimization_goals","kind":"array","property":"optimization_goals","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-optimization-goal.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/product-purchase.json","pointer":"/properties/audience_evidence_pins","kind":"array","property":"audience_evidence_pins","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/audience-evidence-pin.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/product-purchase.json","pointer":"/properties/performance_standards","kind":"array","property":"performance_standards","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-performance-standard.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/product-refinement.json","pointer":"","kind":"array","property":"","side":"other","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/product-refinement.json","pointer":"/items/oneOf/0/properties/ask","kind":"string","property":"ask","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/product-refinement.json","pointer":"/items/oneOf/1/properties/product_id","kind":"string","property":"product_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/product-refinement.json","pointer":"/items/oneOf/1/properties/ask","kind":"string","property":"ask","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/product-refinement.json","pointer":"/items/oneOf/2/properties/proposal_id","kind":"string","property":"proposal_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/product-refinement.json","pointer":"/items/oneOf/2/properties/ask","kind":"string","property":"ask","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/proposal-refinement.json","pointer":"/properties/proposal_id","kind":"string","property":"proposal_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/proposal-refinement.json","pointer":"/properties/ask","kind":"string","property":"ask","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/provide-performance-feedback-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/refine-proposals-request.json","pointer":"/properties/context_id","kind":"string","property":"context_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/refine-proposals-response.json","pointer":"/properties/results","kind":"array","property":"results","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/refine-proposals-response.json","pointer":"/properties/results/items/properties/source_proposal_id","kind":"string","property":"source_proposal_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/refine-proposals-response.json","pointer":"/properties/results/items/properties/proposals","kind":"array","property":"proposals","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-proposal.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/refine-proposals-response.json","pointer":"/properties/results/items/properties/reason","kind":"string","property":"reason","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/refine-proposals-response.json","pointer":"/properties/results/items/properties/unsatisfied_constraints","kind":"array","property":"unsatisfied_constraints","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/refine-proposals-response.json","pointer":"/properties/results/items/properties/unsatisfied_constraints/items","kind":"string","property":"unsatisfied_constraints","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/refine-proposals-response.json","pointer":"/properties/results/items/properties/suggestions","kind":"array","property":"suggestions","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/refine-proposals-response.json","pointer":"/properties/results/items/properties/suggestions/items","kind":"string","property":"suggestions","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/refine-proposals-response.json","pointer":"/properties/products","kind":"array","property":"products","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-product.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/refine-proposals-response.json","pointer":"/properties/collections","kind":"array","property":"collections","side":"response","stability":"experimental","added_in_3_3":true,"in_last_stable":"no","items":"$ref /schemas/core/response-collection.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"media-buy/refine-proposals-response.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/request-proposals-request.json","pointer":"/properties/context_id","kind":"string","property":"context_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/request-proposals-request.json","pointer":"/properties/brief","kind":"string","property":"brief","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":100000,"tier":"string-body","rationale":"Long-form body; matches content (100,000) and transcript (200,000) already in the schemas.","action":"tighten in 4.0"}, + {"file":"media-buy/request-proposals-response.json","pointer":"/properties/reason","kind":"string","property":"reason","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/request-proposals-response.json","pointer":"/properties/suggestions","kind":"array","property":"suggestions","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/request-proposals-response.json","pointer":"/properties/suggestions/items","kind":"string","property":"suggestions","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/request-proposals-response.json","pointer":"/properties/proposals","kind":"array","property":"proposals","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/request-proposals-response.json","pointer":"/properties/products","kind":"array","property":"products","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/canonical-product.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/request-proposals-response.json","pointer":"/properties/collections","kind":"array","property":"collections","side":"response","stability":"experimental","added_in_3_3":true,"in_last_stable":"no","items":"$ref /schemas/core/response-collection.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"media-buy/request-proposals-response.json","pointer":"/properties/incomplete","kind":"array","property":"incomplete","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/request-proposals-response.json","pointer":"/properties/incomplete/items/properties/description","kind":"string","property":"description","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/request-proposals-response.json","pointer":"/properties/purchase_continuation/oneOf/0/properties/product_ids","kind":"array","property":"product_ids","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"media-buy/request-proposals-response.json","pointer":"/properties/purchase_continuation/oneOf/0/properties/product_ids/items","kind":"string","property":"product_ids","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/request-proposals-response.json","pointer":"/properties/purchase_continuation/oneOf/0/properties/feed_version","kind":"string","property":"feed_version","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/request-proposals-response.json","pointer":"/properties/purchase_continuation/oneOf/0/properties/pricing_version","kind":"string","property":"pricing_version","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/request-proposals-response.json","pointer":"/properties/purchase_continuation/oneOf/1/properties/continuation_token","kind":"string","property":"continuation_token","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"media-buy/request-proposals-response.json","pointer":"/properties/purchase_continuation/oneOf/1/properties/product_ids","kind":"array","property":"product_ids","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"media-buy/request-proposals-response.json","pointer":"/properties/purchase_continuation/oneOf/1/properties/product_ids/items","kind":"string","property":"product_ids","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/request-proposals-response.json","pointer":"/properties/purchase_continuation/oneOf/1/properties/losses","kind":"array","property":"losses","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/request-proposals-response.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-audiences-request.json","pointer":"/properties/audiences","kind":"array","property":"audiences","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-audiences-request.json","pointer":"/properties/audiences/items/properties/audience_id","kind":"string","property":"audience_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/sync-audiences-request.json","pointer":"/properties/audiences/items/properties/name","kind":"string","property":"name","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/sync-audiences-request.json","pointer":"/properties/audiences/items/properties/description","kind":"string","property":"description","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/sync-audiences-request.json","pointer":"/properties/audiences/items/properties/tags","kind":"array","property":"tags","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-audiences-request.json","pointer":"/properties/audiences/items/properties/tags/items","kind":"string","property":"tags","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-audiences-request.json","pointer":"/properties/audiences/items/properties/add","kind":"array","property":"add","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/audience-member.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-audiences-request.json","pointer":"/properties/audiences/items/properties/remove","kind":"array","property":"remove","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/audience-member.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-audiences-response.json","pointer":"/oneOf/0/properties/audiences","kind":"array","property":"audiences","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-audiences-response.json","pointer":"/oneOf/0/properties/audiences/items/properties/audience_id","kind":"string","property":"audience_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/sync-audiences-response.json","pointer":"/oneOf/0/properties/audiences/items/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/sync-audiences-response.json","pointer":"/oneOf/0/properties/audiences/items/properties/seller_id","kind":"string","property":"seller_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/sync-audiences-response.json","pointer":"/oneOf/0/properties/audiences/items/properties/match_breakdown","kind":"array","property":"match_breakdown","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-audiences-response.json","pointer":"/oneOf/0/properties/audiences/items/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-audiences-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-audiences-response.json","pointer":"/oneOf/2/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-catalogs-async-response-submitted.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-catalogs-async-response-working.json","pointer":"/properties/current_step","kind":"string","property":"current_step","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-catalogs-request.json","pointer":"/properties/catalog_ids/items","kind":"string","property":"catalog_ids","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/sync-catalogs-response.json","pointer":"/oneOf/0/properties/catalogs","kind":"array","property":"catalogs","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-catalogs-response.json","pointer":"/oneOf/0/properties/catalogs/items/properties/catalog_id","kind":"string","property":"catalog_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/sync-catalogs-response.json","pointer":"/oneOf/0/properties/catalogs/items/properties/platform_id","kind":"string","property":"platform_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/sync-catalogs-response.json","pointer":"/oneOf/0/properties/catalogs/items/properties/item_issues","kind":"array","property":"item_issues","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-catalogs-response.json","pointer":"/oneOf/0/properties/catalogs/items/properties/item_issues/items/properties/item_id","kind":"string","property":"item_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/sync-catalogs-response.json","pointer":"/oneOf/0/properties/catalogs/items/properties/item_issues/items/properties/reasons","kind":"array","property":"reasons","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-catalogs-response.json","pointer":"/oneOf/0/properties/catalogs/items/properties/item_issues/items/properties/reasons/items","kind":"string","property":"reasons","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/sync-catalogs-response.json","pointer":"/oneOf/0/properties/catalogs/items/properties/changes","kind":"array","property":"changes","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-catalogs-response.json","pointer":"/oneOf/0/properties/catalogs/items/properties/changes/items","kind":"string","property":"changes","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-catalogs-response.json","pointer":"/oneOf/0/properties/catalogs/items/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-catalogs-response.json","pointer":"/oneOf/0/properties/catalogs/items/properties/warnings","kind":"array","property":"warnings","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-catalogs-response.json","pointer":"/oneOf/0/properties/catalogs/items/properties/warnings/items","kind":"string","property":"warnings","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-catalogs-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-catalogs-response.json","pointer":"/oneOf/2/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-event-sources-request.json","pointer":"/properties/event_sources","kind":"array","property":"event_sources","side":"request","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-event-sources-request.json","pointer":"/properties/event_sources/items/properties/event_source_id","kind":"string","property":"event_source_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/sync-event-sources-request.json","pointer":"/properties/event_sources/items/properties/name","kind":"string","property":"name","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/sync-event-sources-request.json","pointer":"/properties/event_sources/items/properties/event_types","kind":"array","property":"event_types","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/event-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (31 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-event-sources-request.json","pointer":"/properties/event_sources/items/properties/value_currencies","kind":"array","property":"value_currencies","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-event-sources-request.json","pointer":"/properties/event_sources/items/properties/allowed_domains","kind":"array","property":"allowed_domains","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-event-sources-request.json","pointer":"/properties/event_sources/items/properties/allowed_domains/items","kind":"string","property":"allowed_domains","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"media-buy/sync-event-sources-response.json","pointer":"/oneOf/0/properties/event_sources","kind":"array","property":"event_sources","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-event-sources-response.json","pointer":"/oneOf/0/properties/event_sources/items/properties/event_source_id","kind":"string","property":"event_source_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/sync-event-sources-response.json","pointer":"/oneOf/0/properties/event_sources/items/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/sync-event-sources-response.json","pointer":"/oneOf/0/properties/event_sources/items/properties/seller_id","kind":"string","property":"seller_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/sync-event-sources-response.json","pointer":"/oneOf/0/properties/event_sources/items/properties/event_types","kind":"array","property":"event_types","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/event-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (31 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-event-sources-response.json","pointer":"/oneOf/0/properties/event_sources/items/properties/value_currencies","kind":"array","property":"value_currencies","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-event-sources-response.json","pointer":"/oneOf/0/properties/event_sources/items/properties/setup/properties/snippet","kind":"string","property":"snippet","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-event-sources-response.json","pointer":"/oneOf/0/properties/event_sources/items/properties/setup/properties/instructions","kind":"string","property":"instructions","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/sync-event-sources-response.json","pointer":"/oneOf/0/properties/event_sources/items/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/sync-event-sources-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/update-media-buy-async-response-submitted.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/update-media-buy-async-response-working.json","pointer":"/properties/current_step","kind":"string","property":"current_step","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"media-buy/update-media-buy-request.json","pointer":"/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/update-media-buy-request.json","pointer":"/properties/budget_cap_timezone","kind":"string","property":"budget_cap_timezone","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"media-buy/update-media-buy-request.json","pointer":"/properties/packages","kind":"array","property":"packages","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/media-buy/package-update.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/update-media-buy-request.json","pointer":"/properties/new_packages","kind":"array","property":"new_packages","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/media-buy/package-request.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"media-buy/update-media-buy-response.json","pointer":"/oneOf/0/properties/media_buy_id","kind":"string","property":"media_buy_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"media-buy/update-media-buy-response.json","pointer":"/oneOf/0/properties/budget_cap_timezone","kind":"string","property":"budget_cap_timezone","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"media-buy/update-media-buy-response.json","pointer":"/oneOf/0/properties/affected_packages","kind":"array","property":"affected_packages","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/package.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/update-media-buy-response.json","pointer":"/oneOf/0/properties/valid_actions","kind":"array","property":"valid_actions","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/media-buy-valid-action.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (24 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"media-buy/update-media-buy-response.json","pointer":"/oneOf/0/properties/available_actions","kind":"array","property":"available_actions","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/media-buy-available-action.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"media-buy/update-media-buy-response.json","pointer":"/oneOf/0/properties/warnings","kind":"array","property":"warnings","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/warning.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/update-media-buy-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"media-buy/update-media-buy-response.json","pointer":"/oneOf/2/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"pricing-options/cpa-option.json","pointer":"/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"pricing-options/cpa-option.json","pointer":"/properties/custom_event_name","kind":"string","property":"custom_event_name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"pricing-options/cpa-option.json","pointer":"/properties/event_source_id","kind":"string","property":"event_source_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"pricing-options/cpa-option.json","pointer":"/properties/eligible_adjustments","kind":"array","property":"eligible_adjustments","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/adjustment-kind.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"pricing-options/cpc-option.json","pointer":"/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"pricing-options/cpc-option.json","pointer":"/properties/eligible_adjustments","kind":"array","property":"eligible_adjustments","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/adjustment-kind.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"pricing-options/cpcv-option.json","pointer":"/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"pricing-options/cpcv-option.json","pointer":"/properties/eligible_adjustments","kind":"array","property":"eligible_adjustments","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/adjustment-kind.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"pricing-options/cpm-option.json","pointer":"/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"pricing-options/cpm-option.json","pointer":"/properties/eligible_adjustments","kind":"array","property":"eligible_adjustments","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/adjustment-kind.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"pricing-options/cpp-option.json","pointer":"/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"pricing-options/cpp-option.json","pointer":"/properties/parameters/properties/demographic","kind":"string","property":"demographic","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"pricing-options/cpp-option.json","pointer":"/properties/eligible_adjustments","kind":"array","property":"eligible_adjustments","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/adjustment-kind.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"pricing-options/cpv-option.json","pointer":"/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"pricing-options/cpv-option.json","pointer":"/properties/eligible_adjustments","kind":"array","property":"eligible_adjustments","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/adjustment-kind.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"pricing-options/flat-rate-option.json","pointer":"/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"pricing-options/flat-rate-option.json","pointer":"/properties/parameters/properties/loop_position","kind":"string","property":"loop_position","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"pricing-options/flat-rate-option.json","pointer":"/properties/parameters/properties/venue_package","kind":"string","property":"venue_package","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"pricing-options/flat-rate-option.json","pointer":"/properties/parameters/properties/daypart","kind":"string","property":"daypart","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"pricing-options/flat-rate-option.json","pointer":"/properties/eligible_adjustments","kind":"array","property":"eligible_adjustments","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/adjustment-kind.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"pricing-options/revenue-share-option.json","pointer":"/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"pricing-options/revenue-share-option.json","pointer":"/properties/custom_event_name","kind":"string","property":"custom_event_name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"pricing-options/revenue-share-option.json","pointer":"/properties/event_source_id","kind":"string","property":"event_source_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"pricing-options/time-option.json","pointer":"/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"pricing-options/time-option.json","pointer":"/properties/eligible_adjustments","kind":"array","property":"eligible_adjustments","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/adjustment-kind.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"pricing-options/vcpm-option.json","pointer":"/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"pricing-options/vcpm-option.json","pointer":"/properties/eligible_adjustments","kind":"array","property":"eligible_adjustments","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/adjustment-kind.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"property/authorization-result.json","pointer":"/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"property/authorization-result.json","pointer":"/properties/violation/properties/code","kind":"string","property":"code","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"property/authorization-result.json","pointer":"/properties/violation/properties/message","kind":"string","property":"message","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"property/base-property-source.json","pointer":"/oneOf/0/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"property/base-property-source.json","pointer":"/oneOf/0/properties/tags","kind":"array","property":"tags","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/property-tag.json","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"property/base-property-source.json","pointer":"/oneOf/1/properties/publisher_domain","kind":"string","property":"publisher_domain","side":"both","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"property/base-property-source.json","pointer":"/oneOf/1/properties/property_ids","kind":"array","property":"property_ids","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/property-id.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"property/base-property-source.json","pointer":"/oneOf/2/properties/identifiers","kind":"array","property":"identifiers","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/identifier.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"property/create-property-list-request.json","pointer":"/properties/name","kind":"string","property":"name","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/create-property-list-request.json","pointer":"/properties/description","kind":"string","property":"description","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"property/create-property-list-request.json","pointer":"/properties/base_properties","kind":"array","property":"base_properties","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/property/base-property-source.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"property/create-property-list-response.json","pointer":"/properties/auth_token","kind":"string","property":"auth_token","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"property/delete-property-list-request.json","pointer":"/properties/list_id","kind":"string","property":"list_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/delete-property-list-response.json","pointer":"/properties/list_id","kind":"string","property":"list_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/delivery-record.json","pointer":"/properties/record_id","kind":"string","property":"record_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/get-property-list-request.json","pointer":"/properties/list_id","kind":"string","property":"list_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/get-property-list-request.json","pointer":"/properties/pagination/properties/cursor","kind":"string","property":"cursor","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"property/get-property-list-response.json","pointer":"/properties/identifiers","kind":"array","property":"identifiers","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/identifier.json","proposed_limit":10000,"tier":"array-catalog","rationale":"Resolved page of a property list read by reference; matches the 10,000 ceiling for records.","action":"tighten in 4.0"}, + {"file":"property/get-property-list-response.json","pointer":"/properties/coverage_gaps/additionalProperties","kind":"array","property":"coverage_gaps","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/identifier.json","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"property/list-property-lists-request.json","pointer":"/properties/name_contains","kind":"string","property":"name_contains","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/list-property-lists-response.json","pointer":"/properties/lists","kind":"array","property":"lists","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/property/property-list.json","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"property/property-error.json","pointer":"/properties/message","kind":"string","property":"message","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"property/property-feature-definition.json","pointer":"/properties/feature_id","kind":"string","property":"feature_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/property-feature-definition.json","pointer":"/properties/name","kind":"string","property":"name","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/property-feature-definition.json","pointer":"/properties/description","kind":"string","property":"description","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"property/property-feature-definition.json","pointer":"/properties/allowed_values","kind":"array","property":"allowed_values","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"property/property-feature-definition.json","pointer":"/properties/allowed_values/items","kind":"string","property":"allowed_values","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"property/property-feature-definition.json","pointer":"/properties/coverage/properties/property_types","kind":"array","property":"property_types","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"property/property-feature-definition.json","pointer":"/properties/coverage/properties/property_types/items","kind":"string","property":"property_types","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/property-feature-definition.json","pointer":"/properties/coverage/properties/countries","kind":"array","property":"countries","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"property/property-feature-definition.json","pointer":"/properties/coverage/properties/countries/items","kind":"string","property":"countries","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"property/property-feature-definition.json","pointer":"/properties/methodology_version","kind":"string","property":"methodology_version","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"property/property-feature-result.json","pointer":"/properties/property/oneOf/0","kind":"string","property":"property","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/property-feature-value.json","pointer":"/properties/value/oneOf/2","kind":"string","property":"value","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"property/property-feature-value.json","pointer":"/properties/unit","kind":"string","property":"unit","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"property/property-feature-value.json","pointer":"/properties/methodology_version","kind":"string","property":"methodology_version","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"property/property-feature.json","pointer":"/properties/feature_id","kind":"string","property":"feature_id","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/property-feature.json","pointer":"/properties/value","kind":"string","property":"value","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Scalar value; 255 is the repository default for short values.","action":"tighten in 4.0"}, + {"file":"property/property-feature.json","pointer":"/properties/source","kind":"string","property":"source","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/property-list-changed-webhook.json","pointer":"/properties/list_id","kind":"string","property":"list_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/property-list-changed-webhook.json","pointer":"/properties/list_name","kind":"string","property":"list_name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/property-list-changed-webhook.json","pointer":"/properties/signature","kind":"string","property":"signature","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":4096,"tier":"string-token","rationale":"Opaque token; 4,096 matches cursor and token fields already bounded.","action":"tighten in 4.0"}, + {"file":"property/property-list-filters.json","pointer":"/properties/countries_all","kind":"array","property":"countries_all","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"property/property-list-filters.json","pointer":"/properties/channels_any","kind":"array","property":"channels_any","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/channels.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (20 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"property/property-list-filters.json","pointer":"/properties/property_types","kind":"array","property":"property_types","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/property-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (10 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"property/property-list-filters.json","pointer":"/properties/feature_requirements","kind":"array","property":"feature_requirements","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/feature-requirement.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"property/property-list-filters.json","pointer":"/properties/exclude_identifiers","kind":"array","property":"exclude_identifiers","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/identifier.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"property/property-list.json","pointer":"/properties/list_id","kind":"string","property":"list_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/property-list.json","pointer":"/properties/name","kind":"string","property":"name","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/property-list.json","pointer":"/properties/description","kind":"string","property":"description","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"property/property-list.json","pointer":"/properties/base_properties","kind":"array","property":"base_properties","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/property/base-property-source.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"property/property-list.json","pointer":"/properties/pricing_options","kind":"array","property":"pricing_options","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/vendor-pricing-option.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"property/update-property-list-request.json","pointer":"/properties/list_id","kind":"string","property":"list_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/update-property-list-request.json","pointer":"/properties/name","kind":"string","property":"name","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/update-property-list-request.json","pointer":"/properties/description","kind":"string","property":"description","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"property/update-property-list-request.json","pointer":"/properties/base_properties","kind":"array","property":"base_properties","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/property/base-property-source.json","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"property/validate-property-delivery-request.json","pointer":"/properties/list_id","kind":"string","property":"list_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/validate-property-delivery-response.json","pointer":"/properties/list_id","kind":"string","property":"list_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/validate-property-delivery-response.json","pointer":"/properties/aggregate/properties/grade","kind":"string","property":"grade","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"property/validate-property-delivery-response.json","pointer":"/properties/aggregate/properties/label","kind":"string","property":"label","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/validate-property-delivery-response.json","pointer":"/properties/results","kind":"array","property":"results","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/property/validation-result.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"property/validation-result.json","pointer":"/properties/record_id","kind":"string","property":"record_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/validation-result.json","pointer":"/properties/features","kind":"array","property":"features","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"property/validation-result.json","pointer":"/properties/features/items/properties/feature_id","kind":"string","property":"feature_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/validation-result.json","pointer":"/properties/features/items/properties/policy_id","kind":"string","property":"policy_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"property/validation-result.json","pointer":"/properties/features/items/properties/explanation","kind":"string","property":"explanation","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"property/validation-result.json","pointer":"/properties/features/items/properties/requirement/properties/allowed_values","kind":"array","property":"allowed_values","side":"response","stability":"stable","in_last_stable":"yes","items":"schema","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-request.json","pointer":"/properties/protocols","kind":"array","property":"protocols","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/allOf/21/if/allOf/1/anyOf/0/properties/adcp_version","kind":"string","property":"adcp_version","side":"response","stability":"stable","in_last_stable":"unknown","pattern":"^(?:3\\.(?:[2-9]|[1-9][0-9]+)|(?:[4-9]|[1-9][0-9]+)\\.\\d+)(?:-[a-zA-Z0-9.-]+)?$","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/allOf/21/if/allOf/1/anyOf/1/properties/adcp/properties/supported_versions/contains","kind":"string","property":"supported_versions","side":"response","stability":"stable","in_last_stable":"unknown","pattern":"^(?:3\\.(?:[2-9]|[1-9][0-9]+)|(?:[4-9]|[1-9][0-9]+)\\.\\d+)(?:-[a-zA-Z0-9.-]+)?$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/adcp/properties/major_versions","kind":"array","property":"major_versions","side":"response","stability":"stable","in_last_stable":"yes","items":"integer","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/adcp/properties/supported_versions","kind":"array","property":"supported_versions","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/adcp/properties/supported_versions/items","kind":"string","property":"supported_versions","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/adcp/properties/build_version","kind":"string","property":"build_version","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?(\\+[a-zA-Z0-9.-]+)?$","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/adcp/properties/implementation/properties/sdks/items/properties/components","kind":"array","property":"components","side":"response","stability":"new-3.3","added_in_3_3":true,"in_last_stable":"no","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (8 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/adcp/properties/principal/properties/supported_sections","kind":"array","property":"supported_sections","side":"response","stability":"stable","in_last_stable":"yes","marker_conflict":true,"items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/adcp/properties/principal/properties/reporting_destination_offerings/items/properties/formats","kind":"array","property":"formats","side":"response","stability":"experimental","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/adcp/properties/capability_changes/properties/notifications/oneOf/0/properties/event_types","kind":"array","property":"event_types","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (1 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/adcp/properties/governance_enforcement/properties/tasks/items/oneOf/0/properties/modes","kind":"array","property":"modes","side":"response","stability":"experimental","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/adcp/properties/governance_enforcement/properties/tasks/items/oneOf/1/properties/modes","kind":"array","property":"modes","side":"response","stability":"experimental","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/adcp/properties/governance_enforcement/properties/tasks/items/oneOf/2/properties/modes","kind":"array","property":"modes","side":"response","stability":"experimental","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/adcp/properties/governance_enforcement/properties/tasks/items/oneOf/3/properties/modes","kind":"array","property":"modes","side":"response","stability":"experimental","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/adcp/properties/governance_enforcement/properties/tasks/items/oneOf/4/properties/modes","kind":"array","property":"modes","side":"response","stability":"experimental","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/supported_protocols","kind":"array","property":"supported_protocols","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/account/properties/requests/oneOf/0/properties/changeable_attributes","kind":"array","property":"changeable_attributes","side":"response","stability":"experimental","added_in_3_3":true,"in_last_stable":"unknown","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/account/properties/requests/oneOf/0/properties/pending_action_kinds","kind":"array","property":"pending_action_kinds","side":"response","stability":"experimental","added_in_3_3":true,"in_last_stable":"unknown","items":"$ref /schemas/enums/pending-action-kind.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/account/properties/supported_billing","kind":"array","property":"supported_billing","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/billing-party.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/account/properties/supported_account_currency_modes","kind":"array","property":"supported_account_currency_modes","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/account-currency-mode.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/account/properties/notifications/oneOf/0/properties/event_types","kind":"array","property":"event_types","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (1 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/account/properties/identity_updates/oneOf/0/properties/supported_changes","kind":"array","property":"supported_changes","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/acceptance_policy_discovery/properties/default_profile_ids","kind":"array","property":"default_profile_ids","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":1000,"tier":"array-large","rationale":"Id-like list that scales with an account or portfolio; 1,000 keeps one payload well under the 4 MiB response default.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/acceptance_policy_discovery/properties/default_profile_ids/items","kind":"string","property":"default_profile_ids","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/supported_pricing_models","kind":"array","property":"supported_pricing_models","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/pricing-model.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (10 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/buying_modes","kind":"array","property":"buying_modes","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/lifecycle_tools","kind":"array","property":"lifecycle_tools","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (8 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/proposal_refinement/properties/supported_dimensions","kind":"array","property":"supported_dimensions","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/reporting_delivery_methods","kind":"array","property":"reporting_delivery_methods","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref #/definitions/CapabilityReportingDeliveryMethod","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/offline_delivery_protocols","kind":"array","property":"offline_delivery_protocols","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/cloud-storage-protocol.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/propagation_surfaces","kind":"array","property":"propagation_surfaces","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/supported_indicator_types","kind":"array","property":"supported_indicator_types","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/indicator-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (9 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/execution/properties/axe_integrations","kind":"array","property":"axe_integrations","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/execution/properties/creative_specs/properties/vast_versions","kind":"array","property":"vast_versions","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/vast-version.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/execution/properties/creative_specs/properties/macro_resolution_capabilities","kind":"array","property":"macro_resolution_capabilities","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/macro-resolution-capability.json","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/execution/properties/creative_specs/properties/mraid_versions","kind":"array","property":"mraid_versions","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/execution/properties/creative_specs/properties/mraid_versions/items","kind":"string","property":"mraid_versions","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[0-9]+\\.[0-9]+$","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/execution/properties/targeting/properties/age_restriction/properties/verification_methods","kind":"array","property":"verification_methods","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/age-verification-method.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/execution/properties/targeting/properties/language/oneOf/1/properties/supported_languages","kind":"array","property":"supported_languages","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/locale-tag.json","proposed_limit":256,"tier":"array-enum","rationale":"ISO 639 / BCP 47 language codes (184 two-letter languages): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/execution/properties/targeting/properties/keyword_targets/properties/supported_match_types","kind":"array","property":"supported_match_types","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/match-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/execution/properties/targeting/properties/negative_keywords/properties/supported_match_types","kind":"array","property":"supported_match_types","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/match-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/execution/properties/targeting/properties/geo_proximity/properties/transport_modes","kind":"array","property":"transport_modes","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/transport-mode.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (4 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/audience_evidence/properties/supported_requirement_modes","kind":"array","property":"supported_requirement_modes","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/audience_evidence/properties/supported_presence_modes","kind":"array","property":"supported_presence_modes","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/audience_targeting/properties/supported_identifier_types","kind":"array","property":"supported_identifier_types","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/audience_targeting/properties/supported_uid_types","kind":"array","property":"supported_uid_types","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/uid-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (11 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/supported_optimization_metrics","kind":"array","property":"supported_optimization_metrics","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (12 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/vendor_metric_optimization/properties/supported_targets","kind":"array","property":"supported_targets","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/conversion_tracking/properties/supported_event_types","kind":"array","property":"supported_event_types","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/event-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (31 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/conversion_tracking/properties/supported_targets","kind":"array","property":"supported_targets","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/conversion_tracking/properties/supported_uid_types","kind":"array","property":"supported_uid_types","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/uid-type.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (11 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/conversion_tracking/properties/supported_hashed_identifiers","kind":"array","property":"supported_hashed_identifiers","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/conversion_tracking/properties/supported_action_sources","kind":"array","property":"supported_action_sources","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/action-source.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (9 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/conversion_tracking/properties/attribution_windows","kind":"array","property":"attribution_windows","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/conversion_tracking/properties/attribution_windows/items/properties/post_click","kind":"array","property":"post_click","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/duration.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/conversion_tracking/properties/attribution_windows/items/properties/post_view","kind":"array","property":"post_view","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/duration.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/frequency_capping/properties/supported_per_units","kind":"array","property":"supported_per_units","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/reach-unit.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/frequency_capping/properties/supported_window_units","kind":"array","property":"supported_window_units","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/frequency_capping/properties/supported_window_units/items","kind":"string","property":"supported_window_units","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/budget_capping/properties/supported_scopes","kind":"array","property":"supported_scopes","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/budget_capping/properties/supported_periods","kind":"array","property":"supported_periods","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (1 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/budget_capping/properties/fixed_timezone","kind":"string","property":"fixed_timezone","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Standard short code or duration (ISO 8601, BCP 47, ISO 4217/3166, IANA): 64.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/content_standards/properties/supported_channels","kind":"array","property":"supported_channels","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/channels.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (20 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/portfolio/properties/publisher_domains","kind":"array","property":"publisher_domains","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/portfolio/properties/publisher_domains/items","kind":"string","property":"publisher_domains","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/portfolio/properties/primary_channels","kind":"array","property":"primary_channels","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/channels.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (20 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/media_buy/properties/portfolio/properties/primary_countries","kind":"array","property":"primary_countries","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/signals/properties/data_provider_domains","kind":"array","property":"data_provider_domains","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/signals/properties/data_provider_domains/items","kind":"string","property":"data_provider_domains","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","proposed_limit":253,"tier":"string-domain","rationale":"DNS name, at most 253 octets (RFC 1035).","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/signals/properties/discovery_modes","kind":"array","property":"discovery_modes","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/governance/properties/runtime_attestations/properties/signal_activation/properties/claim_types","kind":"array","property":"claim_types","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/governance/properties/property_features","kind":"array","property":"property_features","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/governance/properties/property_features/items/properties/feature_id","kind":"string","property":"feature_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/governance/properties/property_features/items/properties/categories","kind":"array","property":"categories","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/governance/properties/property_features/items/properties/categories/items","kind":"string","property":"categories","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/governance/properties/property_features/items/properties/description","kind":"string","property":"description","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/governance/properties/creative_features","kind":"array","property":"creative_features","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/governance/properties/creative_features/items/properties/feature_id","kind":"string","property":"feature_id","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/governance/properties/creative_features/items/properties/categories","kind":"array","property":"categories","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/governance/properties/creative_features/items/properties/categories/items","kind":"string","property":"categories","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/governance/properties/creative_features/items/properties/description","kind":"string","property":"description","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/creative/allOf/7/if/properties/supported_formats/contains/properties/capability_id","kind":"string","property":"capability_id","side":"response","stability":"stable","in_last_stable":"unknown","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/creative/properties/representation_resolution/properties/strategies","kind":"array","property":"strategies","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/representation-selection-strategy.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/creative/properties/multiplicity/properties/variant_dimensions","kind":"array","property":"variant_dimensions","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (5 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/creative/properties/multiplicity/properties/selection_strategies","kind":"array","property":"selection_strategies","side":"response","stability":"experimental","in_last_stable":"yes","items":"$ref /schemas/enums/creative-selection-strategy.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (6 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/creative/properties/supported_formats","kind":"array","property":"supported_formats","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/creative/properties/supported_formats/items/properties/capability_id","kind":"string","property":"capability_id","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/creative/properties/supported_formats/items/properties/operations","kind":"array","property":"operations","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (3 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/creative/properties/preview/properties/routes","kind":"array","property":"routes","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/creative/properties/preview/properties/routes/items/properties/capability_id","kind":"string","property":"capability_id","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-zA-Z0-9_-]+$","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/creative/properties/canonical_catalog_version","kind":"string","property":"canonical_catalog_version","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^\\d+\\.\\d+(\\.\\d+)?$","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/request_signing/properties/required_for","kind":"array","property":"required_for","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/request_signing/properties/required_for/items","kind":"string","property":"required_for","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/request_signing/properties/warn_for","kind":"array","property":"warn_for","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/request_signing/properties/warn_for/items","kind":"string","property":"warn_for","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/request_signing/properties/supported_for","kind":"array","property":"supported_for","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/request_signing/properties/supported_for/items","kind":"string","property":"supported_for","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/request_signing/properties/protocol_methods_supported_for","kind":"array","property":"protocol_methods_supported_for","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/request_signing/properties/protocol_methods_warn_for","kind":"array","property":"protocol_methods_warn_for","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/request_signing/properties/protocol_methods_required_for","kind":"array","property":"protocol_methods_required_for","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/request_signing/properties/operation_sources","kind":"array","property":"operation_sources","side":"response","stability":"new-3.3","added_in_3_3":true,"in_last_stable":"no","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/request_signing/properties/profiles","kind":"array","property":"profiles","side":"response","stability":"experimental","added_in_3_3":true,"in_last_stable":"no","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/webhook_signing/properties/algorithms","kind":"array","property":"algorithms","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/webhook_signing/properties/profiles","kind":"array","property":"profiles","side":"response","stability":"experimental","added_in_3_3":true,"in_last_stable":"no","items":"$ref /schemas/enums/webhook-signing-profile.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (2 values), so the enum bounds it; 32 floor.","action":"deferred (#8198)"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/compliance_testing/properties/scenarios","kind":"array","property":"scenarios","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/compliance_testing/properties/scenarios/items","kind":"string","property":"scenarios","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/specialisms","kind":"array","property":"specialisms","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/specialism.json","proposed_limit":33,"tier":"array-enum","rationale":"Enum-valued items (33 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/extensions_supported","kind":"array","property":"extensions_supported","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/extensions_supported/items","kind":"string","property":"extensions_supported","side":"response","stability":"stable","in_last_stable":"yes","pattern":"^[a-z][a-z0-9_]*$","proposed_limit":255,"tier":"string-id","rationale":"Pattern-constrained but unbounded value; 255 is the repository default.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/experimental_features","kind":"array","property":"experimental_features","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/experimental-feature-id.json","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"protocol/get-adcp-capabilities-response.json","pointer":"/properties/wholesale_feed_webhooks/properties/event_types","kind":"array","property":"event_types","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (12 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/get-task-status-response.json","pointer":"/properties/progress/properties/current_step","kind":"string","property":"current_step","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"protocol/get-task-status-response.json","pointer":"/properties/error/properties/code","kind":"string","property":"code","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"protocol/get-task-status-response.json","pointer":"/properties/error/properties/message","kind":"string","property":"message","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"protocol/get-task-status-response.json","pointer":"/properties/error/properties/details/properties/operation","kind":"string","property":"operation","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"protocol/get-task-status-response.json","pointer":"/properties/history","kind":"array","property":"history","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"protocol/list-tasks-request.json","pointer":"/properties/filters/properties/protocols","kind":"array","property":"protocols","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/adcp-protocol.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (7 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/list-tasks-request.json","pointer":"/properties/filters/properties/statuses","kind":"array","property":"statuses","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/task-status.json","proposed_limit":32,"tier":"array-enum","rationale":"Enum-valued items (9 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/list-tasks-request.json","pointer":"/properties/filters/properties/task_types","kind":"array","property":"task_types","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/enums/task-type.json","proposed_limit":38,"tier":"array-enum","rationale":"Enum-valued items (38 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"protocol/list-tasks-request.json","pointer":"/properties/filters/properties/context_contains","kind":"string","property":"context_contains","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"protocol/list-tasks-response.json","pointer":"/properties/query_summary/properties/filters_applied","kind":"array","property":"filters_applied","side":"response","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Attributes of one object (keys, identifiers, applied filters); more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"protocol/list-tasks-response.json","pointer":"/properties/query_summary/properties/filters_applied/items","kind":"string","property":"filters_applied","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"protocol/list-tasks-response.json","pointer":"/properties/query_summary/properties/sort_applied/properties/field","kind":"string","property":"field","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"protocol/list-tasks-response.json","pointer":"/properties/tasks","kind":"array","property":"tasks","side":"response","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"protocol/sync-agent-notification-configs-response.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"registries/v1-canonical-mapping.json","pointer":"/properties/version","kind":"string","property":"version","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"registries/v1-canonical-mapping.json","pointer":"/properties/mappings","kind":"array","property":"mappings","side":"other","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"registries/v1-canonical-mapping.json","pointer":"/properties/mappings/items/properties/v1_pattern/oneOf/0/properties/format_id_glob","kind":"string","property":"format_id_glob","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"registries/v1-canonical-mapping.json","pointer":"/properties/mappings/items/properties/v1_pattern/oneOf/1/properties/structural/properties/asset_types","kind":"array","property":"asset_types","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"registries/v1-canonical-mapping.json","pointer":"/properties/mappings/items/properties/v1_pattern/oneOf/1/properties/structural/properties/asset_types/items","kind":"string","property":"asset_types","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"registries/v1-canonical-mapping.json","pointer":"/properties/mappings/items/properties/v1_pattern/oneOf/1/properties/structural/properties/vast_versions","kind":"array","property":"vast_versions","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"registries/v1-canonical-mapping.json","pointer":"/properties/mappings/items/properties/v1_pattern/oneOf/1/properties/structural/properties/vast_versions/items","kind":"string","property":"vast_versions","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"registries/v1-canonical-mapping.json","pointer":"/properties/mappings/items/properties/v1_pattern/oneOf/1/properties/structural/properties/daast_versions","kind":"array","property":"daast_versions","side":"other","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"registries/v1-canonical-mapping.json","pointer":"/properties/mappings/items/properties/v1_pattern/oneOf/1/properties/structural/properties/daast_versions/items","kind":"string","property":"daast_versions","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"registries/v1-canonical-mapping.json","pointer":"/properties/mappings/items/properties/v2/properties/parameter_mappings","kind":"array","property":"parameter_mappings","side":"other","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"registries/v1-canonical-mapping.json","pointer":"/properties/mappings/items/properties/v2/properties/parameter_mappings/items/properties/source_field","kind":"string","property":"source_field","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"registries/v1-canonical-mapping.json","pointer":"/properties/mappings/items/properties/v2/properties/parameter_mappings/items/properties/target_parameter","kind":"string","property":"target_parameter","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"registries/v1-canonical-mapping.json","pointer":"/properties/mappings/items/properties/notes","kind":"string","property":"notes","side":"other","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"signals/activate-signal-request.json","pointer":"/properties/signal_agent_segment_id","kind":"string","property":"signal_agent_segment_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"signals/activate-signal-request.json","pointer":"/properties/destinations","kind":"array","property":"destinations","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/destination.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"signals/activate-signal-request.json","pointer":"/properties/pricing_option_id","kind":"string","property":"pricing_option_id","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"signals/activate-signal-response.json","pointer":"/oneOf/0/properties/deployments","kind":"array","property":"deployments","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/deployment.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"signals/activate-signal-response.json","pointer":"/oneOf/1/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"signals/get-signals-async-response-submitted.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"response","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"signals/get-signals-async-response-working.json","pointer":"/properties/current_step","kind":"string","property":"current_step","side":"response","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"signals/get-signals-request.json","pointer":"/properties/signal_spec","kind":"string","property":"signal_spec","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"signals/get-signals-request.json","pointer":"/properties/signal_refs","kind":"array","property":"signal_refs","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/signal-ref.json","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"signals/get-signals-request.json","pointer":"/properties/signal_ids","kind":"array","property":"signal_ids","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/signal-id.json","proposed_limit":100,"tier":"array-batch","rationale":"Request id list; 100 matches creative_ids, media_buy_ids and task_ids, which are already bounded at 100.","action":"tighten in 4.0"}, + {"file":"signals/get-signals-request.json","pointer":"/properties/destinations","kind":"array","property":"destinations","side":"request","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/destination.json","proposed_limit":100,"tier":"array-batch","rationale":"Request batch or nested list; 100 matches creative_ids, accounts and changes.","action":"tighten in 4.0"}, + {"file":"signals/get-signals-request.json","pointer":"/properties/countries","kind":"array","property":"countries","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":256,"tier":"array-enum","rationale":"ISO 3166-1 alpha-2 codes (249 assigned): the code set bounds the list, like an enum.","action":"tighten in 4.0"}, + {"file":"signals/get-signals-request.json","pointer":"/properties/fields","kind":"array","property":"fields","side":"request","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":35,"tier":"array-enum","rationale":"Enum-valued items (35 values), so the enum bounds it; 32 floor.","action":"tighten in 4.0"}, + {"file":"signals/get-signals-request.json","pointer":"/properties/if_wholesale_feed_version","kind":"string","property":"if_wholesale_feed_version","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"signals/get-signals-request.json","pointer":"/properties/if_pricing_version","kind":"string","property":"if_pricing_version","side":"request","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"signals/get-signals-response.json","pointer":"/properties/signals","kind":"array","property":"signals","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"signals/get-signals-response.json","pointer":"/properties/signals/items/properties/signal_agent_segment_id","kind":"string","property":"signal_agent_segment_id","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"signals/get-signals-response.json","pointer":"/properties/signals/items/properties/name","kind":"string","property":"name","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":255,"tier":"string-id","rationale":"Identifier or name; 255 is the repository default (262 fields).","action":"tighten in 4.0"}, + {"file":"signals/get-signals-response.json","pointer":"/properties/signals/items/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"signals/get-signals-response.json","pointer":"/properties/signals/items/properties/categories","kind":"array","property":"categories","side":"both","stability":"stable","in_last_stable":"yes","items":"string","proposed_limit":32,"tier":"array-small","rationale":"Closed or near-closed vocabulary; a payload naming more than 32 is a modelling error.","action":"tighten in 4.0"}, + {"file":"signals/get-signals-response.json","pointer":"/properties/signals/items/properties/categories/items","kind":"string","property":"categories","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"signals/get-signals-response.json","pointer":"/properties/signals/items/properties/data_provider","kind":"string","property":"data_provider","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":500,"tier":"string-generic","rationale":"No name signal: 500, to be confirmed by the owning working group.","action":"tighten in 4.0"}, + {"file":"signals/get-signals-response.json","pointer":"/properties/signals/items/properties/deployments","kind":"array","property":"deployments","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/deployment.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"signals/get-signals-response.json","pointer":"/properties/signals/items/properties/pricing_options","kind":"array","property":"pricing_options","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/vendor-pricing-option.json","proposed_limit":100,"tier":"array-typical","rationale":"Typical nested list; 100 until the owning group names a real ceiling.","action":"tighten in 4.0"}, + {"file":"signals/get-signals-response.json","pointer":"/properties/errors","kind":"array","property":"errors","side":"both","stability":"stable","in_last_stable":"yes","items":"$ref /schemas/core/error.json","proposed_limit":100,"tier":"array-typical","rationale":"Diagnostics: more than 100 entries in one payload is a flood, not information.","action":"tighten in 4.0"}, + {"file":"signals/get-signals-response.json","pointer":"/properties/incomplete","kind":"array","property":"incomplete","side":"both","stability":"stable","in_last_stable":"yes","items":"object","proposed_limit":1000,"tier":"array-batch","rationale":"Result page: the request page cap is 100, so 1,000 leaves headroom for unpaginated sellers.","action":"tighten in 4.0"}, + {"file":"signals/get-signals-response.json","pointer":"/properties/incomplete/items/properties/description","kind":"string","property":"description","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":2000,"tier":"string-text","rationale":"Prose for a human or model; 2,000 is the repository default (41 fields).","action":"tighten in 4.0"}, + {"file":"signals/get-signals-response.json","pointer":"/properties/wholesale_feed_version","kind":"string","property":"wholesale_feed_version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"signals/get-signals-response.json","pointer":"/properties/pricing_version","kind":"string","property":"pricing_version","side":"both","stability":"stable","in_last_stable":"yes","proposed_limit":64,"tier":"string-code","rationale":"Short code or version; 64 covers every registered value with room.","action":"tighten in 4.0"}, + {"file":"trusted-match/provider-registration.json","pointer":"/properties/properties","kind":"array","property":"properties","side":"other","stability":"experimental","in_last_stable":"yes","items":"string","proposed_limit":null,"tier":"inline-property-list","rationale":"Property/collection list carried inline; the WG rule is that such lists are passed by reference (agent_url + list_id).","action":"move out of band (4.0)"} + ] +} diff --git a/specs/collection-bounds-proposal.md b/specs/collection-bounds-proposal.md new file mode 100644 index 00000000000..9aba93a9cc3 --- /dev/null +++ b/specs/collection-bounds-proposal.md @@ -0,0 +1,214 @@ +# Bounding list sizes and string lengths (3.3 slice and 4.0 proposal) + +**Status**: Draft for the working group. Follows WG Session C (2026-10-26), which decided to bound list sizes and string lengths across the protocol. + +**Scope of this document**: an inventory of every unbounded array and string in `static/schemas/source/**`, a proposed limit for each, the 3.3 slice that bounds the fields allowed to change in a minor release, and the 4.0 plan for the rest. It is an internal proposal. The numbers are proposals until the owning working groups confirm them. + +**Machine-readable companions** (all generated by `scripts/audit-schema-bounds.cjs`): + +| File | What it holds | +|---|---| +| `scripts/schema-bounds-inventory.json` | The inventory of the tree as committed: one record per unbounded array or string, plus every inline property or collection list. | +| `scripts/schema-bounds-3-3-slice.json` | The bounds the 3.3 slice added, with the limit and tier for each. Written by `--apply`. | + +## The rule that shapes everything + +A minor release only adds. The additive-minor check ([#8502](https://github.com/adcontextprotocol/adcp/pull/8502), `scripts/lint-additive-minor.cjs`) compares the schemas with the last stable release (the highest 3.2.x, 3.2.8 today) and fails on a tightened bound, among other things. It exempts schemas marked `x-status: "experimental"`, and a field that did not exist in 3.2.8 has nothing to be compared with. The audit script picks the same release. So: + +- A bound on a **stable** field that 3.2.8 already carries is a 4.0 change. This document proposes it and the v4 compatibility registry records it. No stable schema is edited. +- A bound on a field that is **new in 3.3** (never in a stable release) or **experimental** is allowed now. That is the 3.3 slice. + +## Inventory + +Counts are for main as of 2026-11-08, before the 3.3 slice. The WG discussed about 1,734 arrays in 460 files on 2026-10-26. Main has moved since: #8505 bounded most of the capabilities-related new and experimental fields, other PRs restructured or removed some, and new experimental fields arrived. + +Strings skipped as already constrained: `enum` (986), `const` (608), `format: date-time` (525), `format: date` (32), `format: email` (11), `format: uuid` (18), a bounded `pattern` (526), and a string that already has `maxLength` (457). A `pattern` is bounded when it is anchored at both ends and has no `*`, `+` or `{n,}`. + +`format: uri` is skipped as the task rules say, but a URI has no length limit of its own. 308 such strings exist and 304 have no `maxLength`. They are listed in the inventory under `unbounded_uri_strings`. Recommendation: treat them like other URL-shaped values and bound them at 2,048 in 4.0. + +### Unbounded arrays: 1,731 in 468 files + +| Stability | Request | Response | Both | Other | Total | +|---|---:|---:|---:|---:|---:| +| stable | 234 | 523 | 454 | 231 | 1,442 | +| experimental | 53 | 129 | 46 | 33 | 261 | +| new in 3.3 | 2 | 11 | 11 | 4 | 28 | +| **Total** | **289** | **663** | **511** | **268** | **1,731** | + +### Unbounded strings: 2,239 in 558 files + +| Stability | Request | Response | Both | Other | Total | +|---|---:|---:|---:|---:|---:| +| stable | 291 | 555 | 576 | 414 | 1,836 | +| experimental | 100 | 192 | 34 | 25 | 351 | +| new in 3.3 | 6 | 21 | 10 | 15 | 52 | +| **Total** | **397** | **768** | **620** | **454** | **2,239** | + +How the columns are decided: + +- **Side.** The script walks every `*-request.json` and every `*-response.json`, `*-async-response-*.json` and `*-webhook*.json` schema and follows `$ref`s. A node reached only from requests is *request*, only from responses (and webhooks, which are agent-to-agent pushes) is *response*, from both is *both*. A node reached from neither is *other*: documents such as `adagents.json`, `brand.json`, registry feeds, `compliance/` and `extensions/`. *Both* is mostly shared core types (`core/product.json`, assets, targeting). +- **Stability.** *Experimental*: the node or an ancestor in its file carries `x-status: "experimental"`. *New in 3.3*: not experimental, the node or an ancestor carries `x-added-in: "3.3.0"`, and 3.2.8 does not carry the same field on the wire. *Stable*: everything else. +- **"On the wire" is checked, not assumed.** Comparing a node with the same pointer in the same released file is not enough: 3.3 moved the relying-party object from `brand.json` into a new shared file. The new file is marked `x-added-in: "3.3.0"`, yet `relying_party_id` and `scheme` shipped in 3.2.7. The script therefore walks back from each candidate to every schema that references it, and asks whether 3.2.8 has the same path from the same root, following `$ref`s on both sides. Branch indexes are ignored, so an unclear match counts as released. The first run of the script without this check proposed two bounds that the additive-minor check rejected, which is how the case was found. +- **Markers that disagree with 3.2.8** (12 nodes) are treated as stable and left alone. They are either a stale `x-added-in` or a false match from the index-blind comparison. Follow-up for the owners: + `core/product.json` and `core/canonical-product.json` `execution_requirements`; `core/wholesale-feed-event.json` `changed_fields` (array and items) and `summary`; `creative/sync-creatives-request.json` `assignment_operations` branch 3 `creative_id` and `package_id`; `media-buy/build-creative-response.json` both `errors` arrays; `core/identity-relying-party.json` `scheme` and `relying_party_id` (moved, shipped in 3.2.7); `protocol/get-adcp-capabilities-response.json` `supported_sections`. + +## Proposed limits + +Every record carries a tier, a limit and a one-line rationale. The tiers follow the numbers the schemas already use. Among bounded arrays, 100 is the ceiling on lists a caller sends (`creative_ids`, `media_buy_ids`, `task_ids`, `accounts`, `changes`), and 10,000 is the ceiling on `records` and `events`. Among bounded strings, 255 is the default for ids and names (262 fields), 2,000 for prose (41), 2,048 for URLs, and 4,096 for cursors and tokens. + +| Tier | Limit | Applies to | Stable fields (4.0) | +|---|---:|---|---:| +| `array-enum` | max(32, enum size); 256 for country and language codes, 1,000 for region codes | A set of enum values, or of codes from a standard code set (ISO 3166-1, ISO 639 / BCP 47, ISO 3166-2). The set bounds it. | 382 | +| `array-small` | 32 | Attributes of one object: keys, identifiers, applied filters, closed vocabularies. | 131 | +| `array-typical` | 100 | Lists nested in an object; the default when no name signal exists. | 652 | +| `array-batch` | 100 request, 1,000 response | Request batches and id lists, and the response that echoes or pages them. | 165 | +| `array-large` | 1,000 | Id, domain and handle lists on a response that scale with an account or portfolio. | 60 | +| `array-catalog` | 10,000 | Records, events, rows, inline catalog items. | 4 | +| `string-code` | 64 (30 for phone) | Codes, versions, currencies, locales, postal codes. | 206 | +| `string-id` | 255 (200 street, 100 city) | Identifiers, names, labels. | 865 | +| `string-domain` | 253 | DNS names. RFC 1035. | 65 | +| `string-text` | 2,000 | Reasons, messages, descriptions. | 200 | +| `string-url` | 2,048 | URL-shaped values. | 11 | +| `string-token` | 4,096 | Cursors, tokens, signatures, consent strings. | 43 | +| `string-body` | 100,000 | Long bodies: asset `content`, `brief`, `preview_html`, video `prompt`. | 15 | +| `string-generic` | 500 | No name signal, including `scope`, `status`, `kind` and similar names that are often free text. Needs the owning group to confirm. | 431 | +| inline property list | none | See the next section. | 48 | + +The large limits and why: + +- **`array-catalog` 10,000.** `core/catalog.json` `items`, `registry-feed-response` `events`, `get-media-buy-delivery-response` `reporting_rows`, `get-property-list-response` `identifiers`. These are the only fields that legitimately carry catalog-scale data in one payload. 10,000 is the ceiling already used for `records` and `events`, and 10,000 small objects fit inside the 4 MiB response default (`security.mdx`). A catalog larger than that has `url` (and pagination), which is where it belongs. Treat 10,000 as the ceiling to argue about, not a target. +- **`trust/v1/trust-acknowledgements.json` `acknowledgements` 10,000** (experimental, in the slice). It is the out-of-band shard for organizations that accept thousands of grants, so it must hold more than the 500 `trust.json` allows inline; a review caught the generic 100 inverting that design. +- **Country, language and region lists: 256, 256 and 1,000**, not 32. A `countries` list draws from ISO 3166-1, which has 249 assigned codes. A rights holder or a global TMP identity provider legitimately names more than 32, and an omitted list often means "worldwide", so a 32 cap would force truncation or an over-claim. The code set bounds the list, like an enum, so `countries` and `excluded_countries` get 256 and `languages` and `locales` (ISO 639 / BCP 47) get 256. `regions` (ISO 3166-2, about 5,000 subdivisions) gets 1,000, enough to name every state or province of several countries. Ladon caught the original 32 on review. +- **`trusted-match/identity-match-request.json` `package_ids` 500**, not the 100 request default. In all-active mode a buyer sends every active package at the publisher, so Identity Match cannot be correlated with Context Match. The sibling `context-match-request` `package_ids` is already `maxItems: 500`. +- **`governance/get-plan-audit-logs-response.json` `entries` 10,000**, not 100. An audit trail grows with the plan, and the endpoint has no pagination, so it takes the 10,000 ceiling for records and events. +- **`match_keys` 64** on `core/product-identity.json` and `trusted-match/provider-registration.json` (experimental, in the slice), not the 32 the `_keys` name rule gives. Both use the item shape of the seller-wide `media_buy.supported_match_keys`, which is already `maxItems: 64`. A product's entries must each be covered by a seller-wide entry, so a lower product cap would stop a product from narrowing a large seller-wide set; the TMP registration is compared with the same rule, so it gets the same cap. +- **`array-large` 1,000.** Id lists a response may enumerate for an account: `media_buy_ids`, `package_ids`, `signal_refs`, `format_ids`, `placement_ids`, `collection_ids`. A seller with a large account has hundreds. On the request side the same lists get 100, to match the siblings already bounded at 100. +- **`string-body` 100,000.** The existing `content` (100,000) and `transcript` (200,000) bounds, applied to asset bodies (CSS, JavaScript, HTML, markdown, VAST, DAAST), briefs and preview markup. Anything bigger is an asset and belongs behind a URL; the 1 MiB `markup` ceiling already in the schemas covers the one place where inline markup must be larger. +- **`string-token` 4,096.** Matches the 4,096 already on `cursor`, `token` and `governance_context`. An IAB TCF consent string can reach a few KB, so it must not be bounded lower. + +Rules of thumb behind the small ones: a list of more than 32 enum values, tags, keys or identifiers on one object is a modelling error; a list of more than 100 items inside a request body should be a paged read or a reference. + +**Names are weak evidence.** (Two cases came out of CI.) The first version of the script gave `scope` a 64-character limit as a short code, and `governance_context` (a signed JWS) 255 as an identifier; every request that carries `governance_context` already bounds it at 4,096. `brand/rights-terms` `exclusivity.scope` is free text, and the brand and governance storyboards failed in CI with "must NOT have more than 64 characters" and "more than 255 characters". Short-code limits now apply only to names that are codes (`code`, `currency`, `country`, `region`, `language`, `locale`, `timezone`, `unit`, `version`, `namespace`, `tag`, `postal_code`). A training-agent storyboard run is the real test of a proposed limit, and the 4.0 work should run one before it ships a bound. + +**Low-confidence limits.** 431 stable strings fall in `string-generic` (500) and most arrays in `array-typical` (100) were not matched by name. They are placeholders for the owning working group. Tightening is the risk, not loosening: a bound can later be raised in a minor release, and cannot be lowered. + +## Property and collection lists are always out of band + +The WG rule: a property or collection list is always passed by reference (`agent_url` + `list_id`, the shape of `property-list-ref.json` and `collection-list-ref.json`), never inline. The script flags every array that carries one inline, bounded or not, and gives it **no limit**. The 4.0 action is **move out of band**. 56 arrays, of which 55 are unbounded; 34 are property lists and 22 are collection lists. + +By where the list sits: + +**Request and response fields: these are the cases to move.** + +| Field | Stability | Side | +|---|---|---| +| `core/product.json` `publisher_properties`, `collections` (and `core/canonical-product.json`) | stable | both / response | +| `core/placement-definition.json` `property_ids`, `property_tags` | stable | other | +| `core/collection-distribution.json` `property_ids` | stable | both | +| `core/publisher-property-selector.json` `publisher_domains`, `property_ids`, `property_tags` | stable | both | +| `core/collection-selection.json` `collections` | stable | both | +| `media-buy/get-products-response.json`, `list-products-response.json`, `refine-proposals-response.json`, `request-proposals-response.json`, `list-collections-response.json`, `brand/get-brand-identity-response.json` `collections` | experimental | response | +| `media-buy/list-collections-request.json` `collections` | experimental | request (already `maxItems: 100`) | +| `trusted-match/provider-registration.json` `properties` (property RIDs a provider serves) | experimental | other | +| `protocol/get-adcp-capabilities-response.json` `media_buy.portfolio.publisher_domains`, `signals.data_provider_domains` | stable | response (owned by #8198; carries `x-max-items-4.0` / `x-max-length-4.0` from #8505) | + +**List authoring: sources that build a managed list.** + +| Field | Stability | +|---|---| +| `property/create-property-list-request.json`, `update-property-list-request.json` `base_properties` | stable | +| `property/base-property-source.json` `property_ids`, `identifiers`, and the tag selectors | stable | +| `property/property-list-filters.json` `exclude_identifiers` | stable | +| `property/property-list.json` `base_properties` (the stored definition, returned on reads) | stable | +| `collection/create-collection-list-request.json`, `update-collection-list-request.json` `base_collections` | stable | +| `collection/base-collection-source.json` `identifiers`, `collection-list-filters.json` `exclude_distribution_ids`, `collection-list.json` `base_collections` | stable | + +**Documents** (`adagents.json`, `brand.json`, `aao/agent-publishers.json`, `core/registry-event.json`): 23 arrays. Here the inline list is the publisher's declaration and is the source of truth, not a list passed between agents, so "by reference" does not apply in the same way. They are flagged and left for the WG to rule on, because 4.0 can still bound them (documents have their own byte caps, for example 2 MiB for `brand.json`). + +Judgment calls: + +- **Authoring needs a way in.** `create_property_list` has to receive the list from somewhere. The `publisher_domain` + `tags` and `property_ids` selectors are queries over adagents.json, but `identifiers` is a plain enumeration. Moving authoring out of band needs a fetch-by-URL or a selector-only form first. That is the WG's call, so the doc proposes no limit and does not pretend the rule is already met. +- **The resolved page of a list read by reference is not inline.** `get_property_list` `identifiers` and `get_collection_list` `collections` are the data plane of the reference mechanism and are bounded at 10,000 per page instead. +- **Experimental inline lists were not bounded in 3.3**, though they could be, because bounding them legitimises the inline shape the WG rule is removing. Seven are left unbounded: six `collections` responses and the TMP provider registration `properties`. The six experimental `collections` fields on responses are the cheapest to move: an experimental surface can change with six weeks' notice. +- **Not flagged:** `allowed_domains` and `allowed_external_domains` in asset requirements (an allow-list of script hosts, not a property list), `placement_refs` (placement references, not properties), `governance_domains` (a vocabulary), `task_types`. + +## The 3.3 slice + +648 bounds in 152 files, listed in `scripts/schema-bounds-3-3-slice.json`: + +| Keyword | Experimental | New in 3.3 | Total | +|---|---:|---:|---:| +| `maxItems` | 231 | 19 | 250 | +| `maxLength` | 349 | 49 | 398 | + +What it does not touch: + +- no stable field (a node classified stable is never edited, including the 12 marker conflicts above); +- `protocol/get-adcp-capabilities-response.json` (owned by #8198) and every node reachable from it through `$ref`: 25 arrays are in the inventory as `deferred (#8198)`, including `core/match-key.json` `uses` and `property_types`, which the capabilities response reaches through `supported_match_keys`. #8505 has since bounded most of that response itself, and `tests/capabilities-structural-bounds.test.cjs` pins a worst-case figure that any new bound on a referenced type moves (an earlier draft of this slice moved it by 180 KB and failed that test); +- inline property and collection lists; +- seven 3.3 beta fields that the #8501 withdrawal PRs remove (next section), in the inventory as `withdrawn (#8501)`; +- five nodes the SDK generators cannot carry a bound on today (below): `core/targeting.json` `collection_lists` and `collection_lists_exclude`, `brand/update-rights-response.json` `generation_credentials`, `creative/list-creatives-response.json` `seller_revision`, and `core/reporting-subscription-coverage.json` `excluded[].package_ids`. They are in the inventory as `deferred (SDK generation)`; +- no `required`, `additionalProperties`, enum or property changes; each edit inserts one keyword after `type`, so no object is opened, closed or extended. + +**Interaction with the #8501 withdrawals.** Four draft PRs withdraw 3.3 beta fields: #8765, #8762, #8758 and #8767 (stacked on #8758). A field they remove gets no bound here, so the two sides never edit the same line, whichever merges first. The script lists them in `WITHDRAWN`: + +| Field | PR | +|---|---| +| `compliance/comply-test-controller-response.json` `forced.proposal_id` | #8765 (entry 1) | +| `core/sla-window.json` `business_calendar_id` | #8762 (entries 11 and 12) | +| `creative/sync-creatives-request.json` `assignments[].trackers` | #8758 (entry 21) | +| `media-buy/get-products-response.json` `refinement_applied[].result_product_id` | #8758 (entry 23) | +| `media-buy/get-products-response.json` `execution_readiness.version` | #8758 (moves to `list_products`) | +| `core/creative-assignment.json` `trackers` | #8767 | +| `core/measurement-terms.json` `billing_measurement.counting_mechanisms` | #8767 | + +The list comes from comparing each PR's base and head trees node by node, and keeping the removed nodes that the slice would otherwise bound. The other withdrawn fields were already bounded on main, are stable or constrained (enum, `$ref`), or are inline `collections` lists. Two of those PRs move a field rather than drop it: #8758 moves `execution_readiness` onto `list_products`, and #8762 gives `core/creative-review-sla.json` its own `business_calendar_id`, `response_max` and `completion_max`. In the new place those fields arrive unbounded, so once this slice is on main the guard below asks for their bounds; `--apply` adds them. Once a withdrawal PR merges, its entries no longer match a node, and the summary lists them as exclusions to delete. + +**Safety against the SDK generators.** The `validate-schema-bundle` workflow generates the TypeScript and Python SDKs from the PR's bundle, and both jobs failed on the first push. Four kinds of bound broke them. Each was reproduced locally with the same steps, the last on 2026-11-08 against `adcp-client` main and `adcp-client-python` `next`: + +- A bounded array that the TypeScript generator hoists into a named type alias (`CollectionLists`): its `@maxItems` post-process looks for an inline `z.array(...)` and fails with "the generated schema did not contain a ZodArray". `collection_lists` and `collection_lists_exclude`. +- A bounded array inside items that the TypeScript generator reduces to `z.object({}).passthrough()` (an `allOf` of `if`/`then` rules): the same post-process finds no `ZodArray` and fails the same way. `reporting-subscription-coverage` `excluded[].package_ids`, which is new since the first push. +- A bound on a type that mixes string with another type (`["integer", "string"]`): the generator emits `z.union([...]).max(N)`, which is not a function. `seller_revision` (its description already says so). The script defers every mixed-type node. +- A Python post-generation fix that matches the unbounded field text (`fix_update_rights_legacy_response_defaults` matches `generation_credentials: list[GenerationCredential]`) reports "changed nothing" once the field carries `max_length`. `update-rights-response.json` `generation_credentials`. + +With those five deferred, both generators run clean: TypeScript through `build:lib` and the creative-asset probe, Python through `regenerate-schemas`, `validate-generated` and `test_code_generation.py`. **This is a warning for 4.0**: tightening 1,442 arrays and 1,836 strings at once will meet more of these. The SDK generators need a pass first, or the bounds land in batches that each regenerate the SDKs. + +**Safety against #8502.** The check compares with 3.2.8, exempts experimental schemas, and cannot compare a field 3.2.8 never carried. The slice was run through `scripts/lint-additive-minor.cjs --baseline-ref origin/main`: no new violation, and `scripts/lint-additive-minor-baseline.json` is unchanged. The same check also found the one mistake in an earlier draft of the script (the moved relying-party fields above), which is why the script compares wire paths. + +**What a 3.3 beta reader sees.** `3.3.0-beta.0` through `3.3.0-beta.4` are published and carry the new-in-3.3 fields without bounds. Bounding them is not a break against any stable release, but a beta consumer that generated code from the beta schemas may see a tighter bound. The scope freeze was 2026-10-26, so after 3.3 GA these fields become stable and can no longer be tightened. This is the last chance. If the WG prefers not to tighten fields that a beta has published, drop the 19 `maxItems` and 49 `maxLength` marked new in 3.3 from the slice and keep the experimental ones. + +**A bound on an experimental field is a patch-level change** under the experimental notice contract (`docs/reference/versioning.mdx`). The changeset is `patch`. + +## The 4.0 plan for stable fields + +1. The 1,442 stable arrays and 1,836 stable strings stay as they are in 3.x. Nothing in this PR edits a stable schema. +2. The v4 compatibility registry has one entry, `schema_bounds_required_in_4_0`, and the migration guide has a section with the tier table, so an implementer sees the limits coming. It is a `new_requirement` and is not observable by a 3.x run (`observed_by.none`), because a 3.x agent is validated against 3.x schemas that carry no bound. +3. At the 4.0 cut, regenerate the inventory, have each working group confirm or change the limit for its fields (the `string-generic` and `array-typical` rows first), and apply the result in one change. Until then the guard below holds the line for 3.3: it fails if an array or string new in 3.3 or experimental has no bound. +4. Property and collection lists move out of band in the same release, so the 25 stable inline arrays in request, response and list-authoring schemas leave them instead of gaining a limit. The 23 in documents wait for the WG's ruling (see above). +5. A staging mechanism already exists. #8505 marks stable fields of the capabilities response (and `core/error.json`) with `x-max-items-4.0`, `x-max-length-4.0` and `x-max-properties-4.0`: annotations with no validation effect in 3.x that 4.0 turns into the keywords. Once the owning groups confirm the limits, the inventory can be written out as those annotations on stable nodes, in one mechanical change. It is not done here: the limits are unconfirmed, and the task scoped schema edits to unreleased and experimental fields. + +## Open questions for the WG + +1. **Beta-published fields.** Tighten the 68 new-in-3.3 bounds now, or leave them to 4.0 with the stable fields (see above). +2. **`format: uri` strings.** 304 unbounded. Bound at 2,048 in 4.0? +3. **Request id lists at 100 versus 1,000.** 100 matches the bounded siblings (`creative_ids`, `media_buy_ids`, `task_ids`). Buyers with large accounts will hit it and should paginate or use a list reference. +4. **Documents (`other` side).** `brand.json` and the other fetched documents have byte caps. Whether they also get item caps is a separate decision from the task payloads. +5. **Property list authoring.** What replaces `base_properties` and `identifiers` as the way to create a list when inline is not allowed. +6. **Markers.** The 12 `x-added-in` markers that disagree with 3.2.8. +7. **SDK generators.** Who fixes the TypeScript and Python generators before the 4.0 bulk tightening, and whether the tightening lands in batches. See the SDK section above. + +## Re-running + +```bash +node scripts/audit-schema-bounds.cjs # summary +node scripts/audit-schema-bounds.cjs --apply # add the open 3.3 bounds, update the slice file and the inventory +node scripts/audit-schema-bounds.cjs --write # regenerate scripts/schema-bounds-inventory.json only +node scripts/audit-schema-bounds.cjs --check # fail if the committed inventory is stale +node scripts/audit-schema-bounds.cjs --check-unreleased # fail if a new-in-3.3 or experimental array/string has no bound +``` + +**Regenerating after a conflict.** `--apply` is idempotent. It bounds every node whose action is `apply in 3.3`, keeps each slice record whose bound is still in the source, and drops the rest. To rebase this slice, or a PR that conflicts with it, take main's copy of each conflicting schema and of the two generated JSON files, then run `node scripts/audit-schema-bounds.cjs --apply`. To keep a field out of the slice, add it to an exclusion in the script with its reason, remove its bound by hand, and run `--apply` again. + +**CI.** `--check-unreleased` runs in the Build Check workflow as `npm run lint:schema-bounds` (about 4 seconds). It is the ratchet: every new 3.3 or experimental array or string arrives with a bound, or with an exclusion that says why not. `--check` is not wired, because it would make every schema PR regenerate a 1.3 MB file. `tests/audit-schema-bounds.test.cjs` covers the script on fixture trees and runs in `test:contracts`. + +**After 3.3 GA**, set `NEW_VERSION` in the script to the next minor, so the guard covers the fields new in that release and stops covering 3.3 fields, which are then stable. diff --git a/static/compliance/source/universal/v4-compatibility.yaml b/static/compliance/source/universal/v4-compatibility.yaml index c944ef069a3..b55917d27a8 100644 --- a/static/compliance/source/universal/v4-compatibility.yaml +++ b/static/compliance/source/universal/v4-compatibility.yaml @@ -188,6 +188,24 @@ checks: schema_sites: - "protocol/get-adcp-capabilities-response.json#/properties/webhook_signing/properties/legacy_hmac_fallback" + - id: schema_bounds_required_in_4_0 + issue: 8512 + change: new_requirement + applies_to: [all_agents] + detection: "A payload carries an array longer, or a string longer, than the 4.0 bound for its field." + fix: >- + Keep every list and string inside the limits proposed in + specs/collection-bounds-proposal.md, and send property and collection + lists by reference (agent_url and list_id) instead of inline. 3.3 already + bounds the arrays and strings that are new in 3.3 or experimental; 4.0 + bounds the stable ones. + observed_by: + none: + reason: >- + The limits are schema constraints on stable fields, which 3.x schemas + do not carry, so a 3.x run validates against no bound and cannot + grade an agent on one. Limits are proposals until the owning working + groups confirm them. - id: capabilities_structural_bounds_required_in_4_0 issue: 8198 change: new_requirement diff --git a/static/schemas/source/account/get-account-financials-response.json b/static/schemas/source/account/get-account-financials-response.json index 5161dee8168..807663597bc 100644 --- a/static/schemas/source/account/get-account-financials-response.json +++ b/static/schemas/source/account/get-account-financials-response.json @@ -171,6 +171,7 @@ }, "adjusts_invoice_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-status": "experimental", "x-added-in": "3.3.0", @@ -178,6 +179,7 @@ }, "lines": { "type": "array", + "maxItems": 100, "x-status": "experimental", "x-added-in": "3.3.0", "description": "Itemised lines tying this invoice's amount to the media buys, packages, official reporting revisions, and reporting adjustments it bills. Reference only, never settles: lines let a buyer reconcile an invoice against delivery and do not create, approve, or settle invoices. Optional; sellers that do not itemise return invoices without lines. Buyers MUST NOT assume lines are exhaustive: the sum of line amounts SHOULD NOT exceed amount, and the remainder is unitemised. Experimental in AdCP 3.3 (account.invoice_lines): a seller that returns lines MUST list account.invoice_lines in experimental_features on get_adcp_capabilities.", diff --git a/static/schemas/source/account/list-account-changes-response.json b/static/schemas/source/account/list-account-changes-response.json index 59099350a1f..b1d24d67d62 100644 --- a/static/schemas/source/account/list-account-changes-response.json +++ b/static/schemas/source/account/list-account-changes-response.json @@ -124,6 +124,7 @@ }, "errors": { "type": "array", + "maxItems": 100, "items": {"$ref": "/schemas/core/error.json"} }, "context": {"$ref": "/schemas/core/context.json"}, diff --git a/static/schemas/source/account/request-account-request.json b/static/schemas/source/account/request-account-request.json index 3b3203263a2..05e50280b20 100644 --- a/static/schemas/source/account/request-account-request.json +++ b/static/schemas/source/account/request-account-request.json @@ -20,6 +20,7 @@ }, "account_id": { "type": "string", + "maxLength": 255, "description": "Change, or select, an existing account. With other fields present, the request changes those attributes on this account; the account keeps its account_id, media buys, and history. With no other fields, it selects the account: a candidate from an ambiguous request, or, on a platform that owns its account namespace, an account the caller's credential does not reach yet. For an account_id the caller cannot reach, the seller MUST answer the same way whether or not the account exists: either always rejected with ACCOUNT_NOT_FOUND, or, for sellers that support access requests, always in_review with waiting_on: buyer and kind: grant. Mutually exclusive with operator; brand is allowed only to change countries.", "x-entity": "account" }, @@ -45,6 +46,7 @@ }, "operator": { "type": "string", + "maxLength": 255, "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$", "description": "Domain of the entity operating on the brand's behalf. When the brand operates directly, the brand's domain. The seller verifies it against the brand's authorized_operators and, where grants are supported, the operator's grant to the calling agent. Required unless account_id is sent." }, @@ -59,6 +61,7 @@ }, "timezone": { "type": "string", + "maxLength": 64, "minLength": 1, "description": "Buyer-selected timezone when the seller declares account_fixed, buyer_selected timezones, as in sync_accounts. An account attribute set when the account opens." }, diff --git a/static/schemas/source/account/request-account-response.json b/static/schemas/source/account/request-account-response.json index 0480cbd456b..9b3ca3a0212 100644 --- a/static/schemas/source/account/request-account-response.json +++ b/static/schemas/source/account/request-account-response.json @@ -34,6 +34,7 @@ }, "errors": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/core/error.json" } }, "context": { "$ref": "/schemas/core/context.json" }, diff --git a/static/schemas/source/brand.json b/static/schemas/source/brand.json index 840036e4ced..4623f37794e 100644 --- a/static/schemas/source/brand.json +++ b/static/schemas/source/brand.json @@ -568,7 +568,8 @@ }, "prohibited_terms": { "type": "array", - "items": { "type": "string", "minLength": 1 }, + "maxItems": 100, + "items": { "type": "string", "maxLength": 2000, "minLength": 1 }, "description": "Words or phrases the brand never uses in copy, across all formats and sellers (e.g., 'binge', a competitor's name). Plain strings that apply regardless of copy language; case-insensitive whole-term matching is the receiver's choice, and enforcement is advisory. For a text slot the effective list is the union of this list and the slot's `text-asset-requirements.prohibited_terms`; neither weakens the other. Distinct from a creative brief's `compliance.prohibited_claims`, which restricts statements judged by meaning. Not overridable per call through `brand_kit_override`.", "x-added-in": "3.3.0" }, @@ -678,6 +679,7 @@ "properties": { "publisher_domain": { "type": "string", + "maxLength": 253, "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$", "description": "Experimental (brand.collection_links). Publisher namespace that declares the collection in its adagents.json. collection_id is unique only within this namespace, so together they form the {publisher_domain, collection_ids} selector that products use.", "x-status": "experimental", diff --git a/static/schemas/source/brand/acquire-rights-request.json b/static/schemas/source/brand/acquire-rights-request.json index 7c9845a750b..39071d90f77 100644 --- a/static/schemas/source/brand/acquire-rights-request.json +++ b/static/schemas/source/brand/acquire-rights-request.json @@ -22,11 +22,13 @@ }, "rights_id": { "type": "string", + "maxLength": 255, "description": "Rights offering identifier from get_rights response", "x-entity": "rights_grant" }, "pricing_option_id": { "type": "string", + "maxLength": 255, "description": "Selected pricing option from the rights offering", "x-entity": "vendor_pricing_option" }, @@ -44,10 +46,12 @@ "properties": { "description": { "type": "string", + "maxLength": 2000, "description": "Description of how the rights will be used" }, "uses": { "type": "array", + "maxItems": 32, "description": "Specific rights uses for this campaign", "items": { "$ref": "/schemas/enums/right-use.json" @@ -56,6 +60,7 @@ }, "countries": { "type": "array", + "maxItems": 256, "description": "Countries where the campaign will run (ISO 3166-1 alpha-2)", "items": { "type": "string", @@ -64,6 +69,7 @@ }, "format_ids": { "type": "array", + "maxItems": 100, "deprecated": true, "x-removed-in": "4.0.0", "description": "Deprecated in AdCP 3.2; removed in AdCP 4.0. Legacy named formats that will be produced. Use `format_kinds` and optional `format_option_refs`.", @@ -73,6 +79,7 @@ }, "format_kinds": { "type": "array", + "maxItems": 32, "description": "Canonical creative format kinds that will be produced under the rights grant.", "items": { "$ref": "/schemas/core/canonical-format-kind.json" }, "minItems": 1, @@ -80,6 +87,7 @@ }, "format_option_refs": { "type": "array", + "maxItems": 100, "description": "Exact canonical publisher or product format options covered by the planned rights use, when kind alone is insufficient.", "items": { "$ref": "/schemas/core/format-option-ref.json" }, "minItems": 1, diff --git a/static/schemas/source/brand/acquire-rights-response.json b/static/schemas/source/brand/acquire-rights-response.json index 0e999403ebe..93ee74ab7c7 100644 --- a/static/schemas/source/brand/acquire-rights-response.json +++ b/static/schemas/source/brand/acquire-rights-response.json @@ -16,6 +16,7 @@ "properties": { "rights_id": { "type": "string", + "maxLength": 255, "description": "Rights grant identifier", "x-entity": "rights_grant" }, @@ -26,6 +27,7 @@ }, "brand_id": { "type": "string", + "maxLength": 255, "description": "Brand identifier of the rights subject", "x-entity": "rights_holder_brand" }, @@ -35,6 +37,7 @@ }, "generation_credentials": { "type": "array", + "maxItems": 100, "description": "Scoped credentials for generating rights-cleared content", "items": { "$ref": "/schemas/core/generation-credential.json" @@ -42,9 +45,11 @@ }, "restrictions": { "type": "array", + "maxItems": 100, "description": "Usage restrictions and requirements", "items": { - "type": "string" + "type": "string", + "maxLength": 500 } }, "disclosure": { @@ -57,6 +62,7 @@ }, "text": { "type": "string", + "maxLength": 2000, "description": "Disclosure text to include with the creative" } }, @@ -116,6 +122,7 @@ "properties": { "rights_id": { "type": "string", + "maxLength": 255, "x-entity": "rights_grant" }, "rights_status": { @@ -125,14 +132,17 @@ }, "brand_id": { "type": "string", + "maxLength": 255, "x-entity": "rights_holder_brand" }, "detail": { "type": "string", + "maxLength": 2000, "description": "Explanation of what requires approval" }, "estimated_response_time": { "type": "string", + "maxLength": 500, "description": "Expected time for approval decision (e.g., '48h', '3 business days')" }, "context": { @@ -159,6 +169,7 @@ "properties": { "rights_id": { "type": "string", + "maxLength": 255, "x-entity": "rights_grant" }, "rights_status": { @@ -168,17 +179,21 @@ }, "brand_id": { "type": "string", + "maxLength": 255, "x-entity": "rights_holder_brand" }, "reason": { "type": "string", + "maxLength": 2000, "description": "Why the rights request was rejected. May be sanitized to protect confidential brand rules — e.g., 'This violates our public figures brand guidelines' rather than naming the specific rule." }, "suggestions": { "type": "array", + "maxItems": 100, "description": "Actionable alternatives the buyer can try. If present, the rejection is fixable — the buyer can adjust their request. If absent, the rejection is final for this talent/rights combination.", "items": { - "type": "string" + "type": "string", + "maxLength": 2000 } }, "context": { @@ -206,6 +221,7 @@ "properties": { "errors": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/core/error.json" }, diff --git a/static/schemas/source/brand/get-brand-identity-response.json b/static/schemas/source/brand/get-brand-identity-response.json index 72d042008f8..c2cfe17a752 100644 --- a/static/schemas/source/brand/get-brand-identity-response.json +++ b/static/schemas/source/brand/get-brand-identity-response.json @@ -518,16 +518,19 @@ "properties": { "publisher_domain": { "type": "string", + "maxLength": 253, "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$", "description": "Publisher namespace that declares the collection in its adagents.json" }, "collection_id": { "type": "string", + "maxLength": 255, "description": "Collection identifier, scoped to publisher_domain", "x-entity": "collection" }, "name": { "type": "string", + "maxLength": 255, "description": "Human-readable collection name" }, "role": { diff --git a/static/schemas/source/brand/get-rights-request.json b/static/schemas/source/brand/get-rights-request.json index 922bac12ba5..aa6b928ead6 100644 --- a/static/schemas/source/brand/get-rights-request.json +++ b/static/schemas/source/brand/get-rights-request.json @@ -18,6 +18,7 @@ }, "uses": { "type": "array", + "maxItems": 32, "description": "Rights uses being requested. The agent returns options covering these uses, potentially bundled into composite pricing.", "items": { "$ref": "/schemas/enums/right-use.json" @@ -30,6 +31,7 @@ }, "countries": { "type": "array", + "maxItems": 256, "description": "Countries where rights are needed (ISO 3166-1 alpha-2). Filters to rights available in these markets.", "items": { "type": "string", @@ -38,6 +40,7 @@ }, "brand_id": { "type": "string", + "maxLength": 255, "description": "Search within a specific brand's rights. If omitted, searches across the agent's full roster.", "x-entity": "rights_holder_brand" }, diff --git a/static/schemas/source/brand/get-rights-response.json b/static/schemas/source/brand/get-rights-response.json index 5b0c2135e28..9725b684e68 100644 --- a/static/schemas/source/brand/get-rights-response.json +++ b/static/schemas/source/brand/get-rights-response.json @@ -16,26 +16,31 @@ "properties": { "rights": { "type": "array", + "maxItems": 100, "description": "Matching rights with pricing options, ranked by relevance", "items": { "type": "object", "properties": { "rights_id": { "type": "string", + "maxLength": 255, "description": "Identifier for this rights offering. Referenced in acquire_rights.", "x-entity": "rights_grant" }, "brand_id": { "type": "string", + "maxLength": 255, "description": "Brand identifier from the agent's roster", "x-entity": "rights_holder_brand" }, "name": { "type": "string", + "maxLength": 255, "description": "Display name of the rights subject" }, "description": { "type": "string", + "maxLength": 2000, "description": "Description of the rights subject" }, "right_type": { @@ -49,13 +54,16 @@ }, "match_reasons": { "type": "array", + "maxItems": 100, "description": "Human-readable reasons for the match", "items": { - "type": "string" + "type": "string", + "maxLength": 2000 } }, "available_uses": { "type": "array", + "maxItems": 32, "description": "Rights uses available for licensing", "items": { "$ref": "/schemas/enums/right-use.json" @@ -63,6 +71,7 @@ }, "countries": { "type": "array", + "maxItems": 256, "description": "Countries where rights are available (ISO 3166-1 alpha-2). When both countries and excluded_countries are present, the effective set is countries minus excluded_countries. If neither is present, all countries are available.", "items": { "type": "string", @@ -71,6 +80,7 @@ }, "excluded_countries": { "type": "array", + "maxItems": 256, "description": "Countries excluded from availability", "items": { "type": "string", @@ -87,9 +97,11 @@ }, "existing_exclusives": { "type": "array", + "maxItems": 100, "description": "Active exclusivity commitments that may affect availability. Implementers should use vague descriptions ('exclusive commitment in this category') rather than specific deal terms to protect confidential business relationships.", "items": { - "type": "string" + "type": "string", + "maxLength": 500 } } }, @@ -97,6 +109,7 @@ }, "pricing_options": { "type": "array", + "maxItems": 100, "description": "Available pricing options for these rights", "items": { "$ref": "/schemas/brand/rights-pricing-option.json" @@ -105,13 +118,16 @@ }, "content_restrictions": { "type": "array", + "maxItems": 100, "description": "Content restrictions or approval requirements", "items": { - "type": "string" + "type": "string", + "maxLength": 500 } }, "preview_assets": { "type": "array", + "maxItems": 100, "description": "Preview-only assets for evaluation", "items": { "type": "object", @@ -121,7 +137,8 @@ "format": "uri" }, "usage": { - "type": "string" + "type": "string", + "maxLength": 2000 } }, "required": [ @@ -143,26 +160,32 @@ }, "excluded": { "type": "array", + "maxItems": 100, "description": "Results that matched but were filtered out, with reasons", "items": { "type": "object", "properties": { "brand_id": { "type": "string", + "maxLength": 255, "x-entity": "rights_holder_brand" }, "name": { - "type": "string" + "type": "string", + "maxLength": 255 }, "reason": { "type": "string", + "maxLength": 2000, "description": "Why this result was excluded. May be sanitized to protect confidential brand rules." }, "suggestions": { "type": "array", + "maxItems": 100, "description": "Actionable alternatives if the exclusion is fixable (e.g., 'Available in BE and DE markets'). Absent if the exclusion is final.", "items": { - "type": "string" + "type": "string", + "maxLength": 2000 } } }, @@ -195,6 +218,7 @@ "properties": { "errors": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/core/error.json" }, diff --git a/static/schemas/source/brand/rights-pricing-option.json b/static/schemas/source/brand/rights-pricing-option.json index b21f356b1bf..05d532a9fb7 100644 --- a/static/schemas/source/brand/rights-pricing-option.json +++ b/static/schemas/source/brand/rights-pricing-option.json @@ -8,6 +8,7 @@ "properties": { "pricing_option_id": { "type": "string", + "maxLength": 255, "description": "Unique identifier for this pricing option. Referenced in acquire_rights and report_usage." }, "model": { @@ -26,6 +27,7 @@ }, "uses": { "type": "array", + "maxItems": 32, "description": "Which rights uses this pricing option covers. A single option can bundle multiple uses (e.g., likeness + voice).", "items": { "$ref": "/schemas/enums/right-use.json" @@ -48,6 +50,7 @@ }, "description": { "type": "string", + "maxLength": 2000, "description": "Human-readable description of this pricing option" }, "ext": { diff --git a/static/schemas/source/brand/rights-terms.json b/static/schemas/source/brand/rights-terms.json index 2cb6e12e3d4..7b14e4264b5 100644 --- a/static/schemas/source/brand/rights-terms.json +++ b/static/schemas/source/brand/rights-terms.json @@ -6,7 +6,7 @@ "x-status": "experimental", "type": "object", "properties": { - "pricing_option_id": { "type": "string" }, + "pricing_option_id": { "type": "string", "maxLength": 255 }, "amount": { "type": "number", "minimum": 0 }, "currency": { "type": "string", @@ -17,6 +17,7 @@ }, "uses": { "type": "array", + "maxItems": 32, "items": { "$ref": "/schemas/enums/right-use.json" } }, "impression_cap": { @@ -39,9 +40,10 @@ "type": "object", "description": "Exclusivity terms if applicable", "properties": { - "scope": { "type": "string" }, + "scope": { "type": "string", "maxLength": 500 }, "countries": { "type": "array", + "maxItems": 256, "items": { "type": "string", "pattern": "^[A-Z]{2}$" diff --git a/static/schemas/source/brand/search-brands-request.json b/static/schemas/source/brand/search-brands-request.json index 582c80135f3..13521d268e0 100644 --- a/static/schemas/source/brand/search-brands-request.json +++ b/static/schemas/source/brand/search-brands-request.json @@ -19,6 +19,7 @@ }, "industries": { "type": "array", + "maxItems": 81, "description": "Optional industry filter. The agent restricts results to brands operating in these industries. Values follow the advertiser-industry taxonomy; the agent SHOULD accept unknown values gracefully per the advertiser-industry extension policy.", "items": { "$ref": "/schemas/enums/advertiser-industry.json" @@ -27,6 +28,7 @@ }, "countries": { "type": "array", + "maxItems": 256, "description": "Optional market filter. Returns brands with rights availability in at least one of the specified countries (ISO 3166-1 alpha-2).", "items": { "type": "string", diff --git a/static/schemas/source/brand/search-brands-response.json b/static/schemas/source/brand/search-brands-response.json index 5275265ee82..b93049d2e87 100644 --- a/static/schemas/source/brand/search-brands-response.json +++ b/static/schemas/source/brand/search-brands-response.json @@ -11,6 +11,7 @@ "properties": { "brand_id": { "type": "string", + "maxLength": 255, "description": "Brand identifier. Pass to get_brand_identity or get_rights for the next step.", "x-entity": "advertiser_brand" }, @@ -20,10 +21,12 @@ "properties": { "domain": { "type": "string", + "maxLength": 253, "description": "House domain (e.g., acme-corp.com). For mutually confirmed relationships (relationship_trust = mutual or inline) this domain is trust-extending. For one-sided or unconfirmed claims see also claimed_house_domain." }, "name": { "type": "string", + "maxLength": 255, "description": "House display name" } }, @@ -52,25 +55,30 @@ }, "claimed_house_domain": { "type": "string", + "maxLength": 253, "description": "Canonical domain of the house this brand self-declares as its parent. Not trust-extending on its own. Present for leaf_only and unverifiable trust states where the brand has made a claim that could not be or has not been reciprocated." }, "names": { "type": "array", + "maxItems": 32, "description": "Localized brand names with BCP 47 locale code keys (e.g., 'en_US', 'fr_CA').", "items": { "type": "object", "minProperties": 1, "additionalProperties": { - "type": "string" + "type": "string", + "maxLength": 500 } } }, "description": { "type": "string", + "maxLength": 2000, "description": "Brand description" }, "industries": { "type": "array", + "maxItems": 81, "items": { "$ref": "/schemas/enums/advertiser-industry.json" }, @@ -89,6 +97,7 @@ }, "logos": { "type": "array", + "maxItems": 100, "description": "Standard-resolution logos for display during discovery. High-res variants are gated behind get_brand_identity with account authorization.", "items": { "type": "object", @@ -141,12 +150,14 @@ "properties": { "available_uses": { "type": "array", + "maxItems": 32, "items": { "$ref": "/schemas/enums/right-use.json" } }, "countries": { "type": "array", + "maxItems": 256, "description": "Countries where rights are available (ISO 3166-1 alpha-2). If omitted, rights are available worldwide.", "items": { "type": "string", @@ -155,6 +166,7 @@ }, "excluded_countries": { "type": "array", + "maxItems": 256, "description": "Countries excluded from availability (ISO 3166-1 alpha-2)", "items": { "type": "string", @@ -179,6 +191,7 @@ "properties": { "brands": { "type": "array", + "maxItems": 1000, "description": "Brand stubs matching the query, ranked by relevance", "items": { "$ref": "#/definitions/SearchBrandResult" @@ -210,6 +223,7 @@ "properties": { "errors": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/core/error.json" }, diff --git a/static/schemas/source/brand/update-rights-request.json b/static/schemas/source/brand/update-rights-request.json index c45a1ff78c5..6a34db5dfda 100644 --- a/static/schemas/source/brand/update-rights-request.json +++ b/static/schemas/source/brand/update-rights-request.json @@ -27,6 +27,7 @@ }, "rights_id": { "type": "string", + "maxLength": 255, "description": "Rights grant identifier from acquire_rights response", "x-entity": "rights_grant" }, @@ -46,6 +47,7 @@ }, "pricing_option_id": { "type": "string", + "maxLength": 255, "description": "Switch to a different pricing option from the original get_rights offering. The new option must be compatible with the existing grant's uses and countries.", "x-entity": "vendor_pricing_option" }, diff --git a/static/schemas/source/brand/update-rights-response.json b/static/schemas/source/brand/update-rights-response.json index 1633c7b8c9a..bbbdbb5fd29 100644 --- a/static/schemas/source/brand/update-rights-response.json +++ b/static/schemas/source/brand/update-rights-response.json @@ -16,6 +16,7 @@ "properties": { "rights_id": { "type": "string", + "maxLength": 255, "description": "Rights grant identifier", "x-entity": "rights_grant" }, @@ -74,6 +75,7 @@ "properties": { "errors": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/core/error.json" }, diff --git a/static/schemas/source/compliance/comply-test-controller-request.json b/static/schemas/source/compliance/comply-test-controller-request.json index 89bde52edfc..9a07e918133 100644 --- a/static/schemas/source/compliance/comply-test-controller-request.json +++ b/static/schemas/source/compliance/comply-test-controller-request.json @@ -1347,6 +1347,7 @@ }, "installment_delivery": { "type": "array", + "maxItems": 100, "minItems": 1, "x-status": "experimental", "x-added-in": "3.3.0", diff --git a/static/schemas/source/compliance/comply-test-controller-response.json b/static/schemas/source/compliance/comply-test-controller-response.json index 8954845b559..11ea62bc386 100644 --- a/static/schemas/source/compliance/comply-test-controller-response.json +++ b/static/schemas/source/compliance/comply-test-controller-response.json @@ -23,6 +23,7 @@ }, "account_id": { "type": "string", + "maxLength": 255, "minLength": 1, "description": "The account whose timezone the call set, as params.account_id named it.", "x-entity": "account" @@ -48,6 +49,7 @@ }, "timezone_cutovers": { "type": "array", + "maxItems": 100, "x-status": "experimental", "x-added-in": "3.3.0", "description": "The cutovers the change records, shaped as get_reporting_status subscription_coverage[].timezone_cutovers[] entries: one per account_timezone-aligned offering the seller offers, each naming offering_id, previous_timezone, timezone, and effective_at, the end of that offering's last old-timezone period that started before changed_at. Coverage lists the same instants for the offerings a subscription covers, and MAY merge entries that share boundaries into one without offering_id. Empty when the call changed nothing or the seller offers no account_timezone-aligned offering.", diff --git a/static/schemas/source/core/account-candidate.json b/static/schemas/source/core/account-candidate.json index f9794c70e1e..77b0487e309 100644 --- a/static/schemas/source/core/account-candidate.json +++ b/static/schemas/source/core/account-candidate.json @@ -7,10 +7,10 @@ "description": "An account that matches an account request or an ambiguous account reference, offered so a human can pick one. Only accounts the caller is already granted are ever offered.", "type": "object", "properties": { - "account_id": { "type": "string", "x-entity": "account" }, - "name": { "type": "string" }, + "account_id": { "type": "string", "maxLength": 255, "x-entity": "account" }, + "name": { "type": "string", "maxLength": 255 }, "brand": { "$ref": "/schemas/core/brand-key.json" }, - "operator": { "type": "string" }, + "operator": { "type": "string", "maxLength": 255 }, "currency": { "type": "string", "pattern": "^[A-Z]{3}$" } }, "required": ["account_id", "name"], diff --git a/static/schemas/source/core/account-request-record.json b/static/schemas/source/core/account-request-record.json index baafbba087b..fe0bd643775 100644 --- a/static/schemas/source/core/account-request-record.json +++ b/static/schemas/source/core/account-request-record.json @@ -22,13 +22,13 @@ "type": "object", "description": "Echo of what was requested: for an open, the brand, operator, and attributes; for a change, the account_id and the requested changes. When a repeat request replaced an open request's terms or changes, this shows the replacement. Never echoes billing_entity bank details or other write-only fields.", "properties": { - "account_id": { "type": "string", "description": "Present when the request named an existing account." }, + "account_id": { "type": "string", "maxLength": 255, "description": "Present when the request named an existing account." }, "revision": { "type": "integer", "minimum": 1, "description": "The revision a change request was based on, when sent." }, "brand": { "$ref": "/schemas/core/brand-key.json" }, - "operator": { "type": "string" }, + "operator": { "type": "string", "maxLength": 255 }, "operator_unit": { "$ref": "/schemas/core/operator-unit.json" }, "currency": { "type": "string", "pattern": "^[A-Z]{3}$" }, - "timezone": { "type": "string", "minLength": 1 }, + "timezone": { "type": "string", "maxLength": 64, "minLength": 1 }, "sandbox": { "type": "boolean" }, "billing": { "$ref": "/schemas/enums/billing-party.json" }, "payment_terms": { "$ref": "/schemas/enums/payment-terms.json" } @@ -41,6 +41,7 @@ }, "account_id": { "type": "string", + "maxLength": 255, "description": "Present when state is resolved: the account this request resolved to. Never changes for the life of the account. For an open request, it is the account to reference from now on. On a change request that resolves as updated, it equals requested.account_id. On a change request that resolves as created or matched, it is a different account from requested.account_id; the named account is unchanged and stays usable, and whether to use the resolved account for new buys is the buyer's choice. Existing account-scoped calls are not redirected to it.", "x-entity": "account" }, @@ -80,6 +81,7 @@ }, "errors": { "type": "array", + "maxItems": 100, "description": "Present when state is rejected. Why the seller declined, or that a buyer action expired.", "items": { "$ref": "/schemas/core/error.json" }, "minItems": 1 diff --git a/static/schemas/source/core/agent-reporting-destination.json b/static/schemas/source/core/agent-reporting-destination.json index 968bf4e1354..f91f50f50d7 100644 --- a/static/schemas/source/core/agent-reporting-destination.json +++ b/static/schemas/source/core/agent-reporting-destination.json @@ -51,6 +51,7 @@ }, "accepted_formats": { "type": "array", + "maxItems": 32, "items": { "type": "string", "enum": [ diff --git a/static/schemas/source/core/assets/display-tag-asset.json b/static/schemas/source/core/assets/display-tag-asset.json index ec0cddcc0d9..a9691d80fe8 100644 --- a/static/schemas/source/core/assets/display-tag-asset.json +++ b/static/schemas/source/core/assets/display-tag-asset.json @@ -31,6 +31,7 @@ "sizes": { "x-added-in": "3.3.0", "type": "array", + "maxItems": 32, "minItems": 1, "items": { "type": "object", diff --git a/static/schemas/source/core/assets/html-asset.json b/static/schemas/source/core/assets/html-asset.json index 942d6e63ee4..7e789069a5f 100644 --- a/static/schemas/source/core/assets/html-asset.json +++ b/static/schemas/source/core/assets/html-asset.json @@ -56,6 +56,7 @@ "sizes": { "x-added-in": "3.3.0", "type": "array", + "maxItems": 32, "minItems": 1, "items": { "type": "object", diff --git a/static/schemas/source/core/assets/zip-asset.json b/static/schemas/source/core/assets/zip-asset.json index 2b7927572f8..d42f820b8f5 100644 --- a/static/schemas/source/core/assets/zip-asset.json +++ b/static/schemas/source/core/assets/zip-asset.json @@ -77,6 +77,7 @@ "sizes": { "x-added-in": "3.3.0", "type": "array", + "maxItems": 32, "minItems": 1, "items": { "type": "object", diff --git a/static/schemas/source/core/assignment-tracker.json b/static/schemas/source/core/assignment-tracker.json index c2d208c2cea..d047f427c7a 100644 --- a/static/schemas/source/core/assignment-tracker.json +++ b/static/schemas/source/core/assignment-tracker.json @@ -12,6 +12,7 @@ }, "custom_event_name": { "type": "string", + "maxLength": 255, "minLength": 1, "description": "Required when event is custom; MUST be absent otherwise. The seller must recognize and fire this event or reject the assignment." }, diff --git a/static/schemas/source/core/buyer-onboarding-posture.json b/static/schemas/source/core/buyer-onboarding-posture.json index 93f04144012..2452f3ee6ff 100644 --- a/static/schemas/source/core/buyer-onboarding-posture.json +++ b/static/schemas/source/core/buyer-onboarding-posture.json @@ -12,6 +12,7 @@ }, "requirements": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/core/agent-onboarding-requirement.json" }, "description": "What a seller must satisfy. Uses the kinds that apply when a buyer gates a seller (aao_verified, storyboard, sandbox, experimental_feature)." }, @@ -22,6 +23,7 @@ }, "message": { "type": "string", + "maxLength": 2000, "description": "Human-readable summary; the fallback whenever a reader does not understand a requirement." }, "ext": { diff --git a/static/schemas/source/core/canonical-installment.json b/static/schemas/source/core/canonical-installment.json index 8404a340953..7d44e489d52 100644 --- a/static/schemas/source/core/canonical-installment.json +++ b/static/schemas/source/core/canonical-installment.json @@ -8,6 +8,7 @@ "properties": { "installment_id": { "type": "string", + "maxLength": 255, "minLength": 1, "description": "Installment ID within the referenced collection. Collection-scoped, not globally unique.", "x-entity": "installment" @@ -18,14 +19,17 @@ }, "name": { "type": "string", + "maxLength": 255, "description": "Installment title" }, "season": { "type": "string", + "maxLength": 64, "description": "Season identifier (e.g., '1', '2024', 'spring_2026')" }, "installment_number": { "type": "string", + "maxLength": 64, "description": "Installment number within the season (e.g., '3', '47')" }, "scheduled_at": { @@ -57,8 +61,9 @@ }, "topics": { "type": "array", + "maxItems": 32, "description": "Content topics for this installment. Uses the same taxonomy as the collection's genre_taxonomy when present. Enables installment-level brand safety evaluation beyond content_rating.", - "items": { "type": "string" }, + "items": { "type": "string", "maxLength": 500 }, "minItems": 1 }, "special": { @@ -67,6 +72,7 @@ }, "guest_talent": { "type": "array", + "maxItems": 100, "description": "Installment-specific guests and talent. Additive to the collection's recurring talent.", "items": { "$ref": "/schemas/core/talent.json" }, "minItems": 1 diff --git a/static/schemas/source/core/canonical-placement.json b/static/schemas/source/core/canonical-placement.json index 74dceba7ce7..4b6a714b681 100644 --- a/static/schemas/source/core/canonical-placement.json +++ b/static/schemas/source/core/canonical-placement.json @@ -21,10 +21,10 @@ "type": "object", "description": "Structured street address for a DOOH/OOH placement, for display and geocoding fallback when coordinates are absent or imprecise.", "properties": { - "line1": { "type": "string", "description": "Street address line (e.g., '89 E 42nd St')." }, - "city": { "type": "string", "description": "City name." }, - "region": { "type": "string", "description": "State, province, or region. ISO 3166-2 subdivision code preferred (e.g., 'US-NY')." }, - "postal_code": { "type": "string", "description": "Postal or ZIP code." }, + "line1": { "type": "string", "maxLength": 200, "description": "Street address line (e.g., '89 E 42nd St')." }, + "city": { "type": "string", "maxLength": 100, "description": "City name." }, + "region": { "type": "string", "maxLength": 64, "description": "State, province, or region. ISO 3166-2 subdivision code preferred (e.g., 'US-NY')." }, + "postal_code": { "type": "string", "maxLength": 64, "description": "Postal or ZIP code." }, "country": { "type": "string", "pattern": "^[A-Z]{2}$", "description": "ISO 3166-1 alpha-2 country code." } }, "additionalProperties": false diff --git a/static/schemas/source/core/canonical-projection-ref.json b/static/schemas/source/core/canonical-projection-ref.json index e20976d711e..a45c4184ec7 100644 --- a/static/schemas/source/core/canonical-projection-ref.json +++ b/static/schemas/source/core/canonical-projection-ref.json @@ -25,6 +25,7 @@ }, "supported_delivery_types": { "type": "array", + "maxItems": 32, "minItems": 1, "uniqueItems": true, "items": { diff --git a/static/schemas/source/core/canonical-proposal.json b/static/schemas/source/core/canonical-proposal.json index 19328387b59..6cb4af3597b 100644 --- a/static/schemas/source/core/canonical-proposal.json +++ b/static/schemas/source/core/canonical-proposal.json @@ -62,6 +62,7 @@ }, "holds": { "type": "array", + "maxItems": 100, "minItems": 1, "x-status": "experimental", "x-added-in": "3.3.0", @@ -71,6 +72,7 @@ "properties": { "product_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-entity": "product", "description": "Allocated product, from commercial_terms.purchases, whose inventory in this installment is held." diff --git a/static/schemas/source/core/creative-staged-update.json b/static/schemas/source/core/creative-staged-update.json index 15c35c9d5da..618e7b96e5b 100644 --- a/static/schemas/source/core/creative-staged-update.json +++ b/static/schemas/source/core/creative-staged-update.json @@ -16,6 +16,7 @@ }, "change_kinds": { "type": "array", + "maxItems": 32, "items": { "$ref": "/schemas/enums/creative-change-kind.json" }, "minItems": 1, "uniqueItems": true, @@ -28,6 +29,7 @@ }, "rejection_reason": { "type": "string", + "maxLength": 2000, "description": "Human-readable reason. Present only when status is rejected." } }, diff --git a/static/schemas/source/core/delivery-metrics.json b/static/schemas/source/core/delivery-metrics.json index 02e48ccc1d9..c74fb5bac72 100644 --- a/static/schemas/source/core/delivery-metrics.json +++ b/static/schemas/source/core/delivery-metrics.json @@ -329,12 +329,14 @@ "properties": { "panels": { "type": "array", + "maxItems": 100, "description": "Panels (faces) covered by this row. A panel commonly carries multiple identifiers at once — OOH contracts key line items on the measurement-currency panel number AND the operator's own panel number together.", "items": { "type": "object", "properties": { "identifiers": { "type": "array", + "maxItems": 32, "minItems": 1, "description": "All identifiers for this panel, one entry per scheme", "items": { @@ -342,6 +344,7 @@ "properties": { "id": { "type": "string", + "maxLength": 255, "description": "Panel/face identifier within the id_type namespace" }, "id_type": { @@ -356,6 +359,7 @@ }, "name": { "type": "string", + "maxLength": 255, "description": "Human-readable location description (e.g., 'I-95 N of Exit 12, right-hand read')" } }, @@ -406,12 +410,14 @@ }, "postings": { "type": "array", + "maxItems": 100, "description": "Posting records — the seller-attested settlement artifact proving each panel was posted for the period. Industry convention (OAAA model contracts, Proof of Performance §3.5): photo evidence per bulletin within five calendar days of posting and again after each rotary rotation; one representative close-up photograph per creative design variation for poster showings (no deadline attached). Distinct from the §2.2 posting-completion obligation (posting within five business days of the scheduled date), which governs average_posted_date, not evidence.", "items": { "type": "object", "properties": { "panel_id": { "type": "string", + "maxLength": 255, "description": "Panel reference matching one of panels[].identifiers[].id" }, "event_type": { @@ -436,6 +442,7 @@ }, "calculation_notes": { "type": "string", + "maxLength": 2000, "description": "Row-specific methodology context that doesn't fit the structured fields (e.g., a partial-period proration or a market-specific estimate adjustment). Same role as dooh_metrics.calculation_notes — canonical methodology declarations belong on the measurement vendor's discoverable surfaces, not here." } }, @@ -457,6 +464,7 @@ }, "position_delivered": { "type": "string", + "maxLength": 255, "description": "Position in which the insertion actually ran (e.g., 'right_hand', 'outside_back_cover'). Unconstrained free-form text until a shared print position vocabulary exists; compare against the position the buyer booked." }, "circulation_delivered": { @@ -708,6 +716,7 @@ }, "vendor_metric_provenance": { "type": "array", + "maxItems": 100, "x-status": "experimental", "x-added-in": "3.3.0", "description": "Experimental (media_buy.measurement_provenance). Collection-mechanism provenance for rows of `vendor_metric_values` in this object, one entry per `(vendor, metric_id, qualifier)` and joined on that key. A sibling of the closed rows, not a field on them. Sellers that emit it declare `media_buy.measurement_provenance` in `experimental_features`. Omit when no row has provenance to report.", diff --git a/static/schemas/source/core/demographic-gender.json b/static/schemas/source/core/demographic-gender.json index af41d7f244d..d74663c632e 100644 --- a/static/schemas/source/core/demographic-gender.json +++ b/static/schemas/source/core/demographic-gender.json @@ -7,6 +7,7 @@ "properties": { "values": { "type": "array", + "maxItems": 32, "items": { "type": "string", "enum": [ diff --git a/static/schemas/source/core/demographic-targeting-capability.json b/static/schemas/source/core/demographic-targeting-capability.json index 7237d13fbb1..d5e4490c412 100644 --- a/static/schemas/source/core/demographic-targeting-capability.json +++ b/static/schemas/source/core/demographic-targeting-capability.json @@ -143,6 +143,7 @@ "properties": { "execution_modes": { "type": "array", + "maxItems": 32, "items": { "type": "string", "enum": [ @@ -158,6 +159,7 @@ }, "values": { "type": "array", + "maxItems": 32, "items": { "type": "string", "enum": [ diff --git a/static/schemas/source/core/demographic-targeting-resolution.json b/static/schemas/source/core/demographic-targeting-resolution.json index 71e0b2a6b49..78c79169522 100644 --- a/static/schemas/source/core/demographic-targeting-resolution.json +++ b/static/schemas/source/core/demographic-targeting-resolution.json @@ -146,9 +146,11 @@ }, "interval_ids": { "type": "array", + "maxItems": 1000, "description": "Seller-scoped interval identifiers whose union produced applied.", "items": { "type": "string", + "maxLength": 255, "minLength": 1, "x-entity": "demographic_interval_id" }, @@ -180,6 +182,7 @@ }, "signal_refs": { "type": "array", + "maxItems": 1000, "description": "Authoritative signal references whose demographic predicates were unioned to produce applied. Signal names alone never establish equivalence.", "items": { "$ref": "/schemas/core/signal-ref.json" @@ -239,6 +242,7 @@ }, "signal_refs": { "type": "array", + "maxItems": 1000, "description": "Authoritative signal references whose demographic predicates were unioned to produce applied. Signal names alone never establish equivalence.", "items": { "$ref": "/schemas/core/signal-ref.json" diff --git a/static/schemas/source/core/dooh-inventory-summary.json b/static/schemas/source/core/dooh-inventory-summary.json index 33f55cd4c00..088c9a018c6 100644 --- a/static/schemas/source/core/dooh-inventory-summary.json +++ b/static/schemas/source/core/dooh-inventory-summary.json @@ -17,6 +17,7 @@ }, "system": { "type": "string", + "maxLength": 500, "description": "Classification system for metro or postal_area rows. Metro rows use metro-system.json values such as 'nielsen_dma'; native postal rows use country-local postal-system.json values such as 'zip' with country 'US'; deprecated legacy postal rows may use legacy-postal-system.json values such as 'us_zip'. Omit for country and region rows." }, "country": { @@ -26,10 +27,12 @@ }, "geo_code": { "type": "string", + "maxLength": 64, "description": "Geographic code within geo_level and system, matching forecast-dimension-geo.json's conventions: ISO 3166-1 alpha-2 for country ('US'), ISO 3166-2 with country prefix for region ('US-CA'), system-specific code for metro/postal_area ('501', '10001')." }, "venue_type": { "type": "string", + "maxLength": 500, "description": "OpenOOH Venue Taxonomy enumeration ID for this row, prefixed with the taxonomy authority and version for unambiguous interchange (e.g., 'openooh-1.1:20501'), matching the identifier-types.json openooh_venue_type convention. Omit when the row aggregates across venue types." }, "count": { @@ -114,6 +117,7 @@ "properties": { "venue_counts": { "type": "array", + "maxItems": 100, "description": "Aggregate venue/screen counts broken out by geography and, optionally, venue type.", "items": { "$ref": "#/definitions/DoohVenueCount" }, "minItems": 1 diff --git a/static/schemas/source/core/evaluator-spec.json b/static/schemas/source/core/evaluator-spec.json index 9f6b109e76e..b7179b7441d 100644 --- a/static/schemas/source/core/evaluator-spec.json +++ b/static/schemas/source/core/evaluator-spec.json @@ -8,6 +8,7 @@ "properties": { "feature_requirement": { "type": "array", + "maxItems": 100, "description": "Optional hard GATE over creative-feature values — the predicates a leaf MUST satisfy for the producing agent to recommend/return it. Reuses the feature-requirement shape (min_value/max_value for quantitative features like creative_quality_score, allowed_values for binary/categorical) — the same predicate vocabulary that gates property/audience filters, which its own schema names as an intended creative-gate reuse. A leaf that fails any predicate is DROPPED from the agent's best_of_n survivors before ranking — this is internal pruning of which leaves the agent recommends, not an AdCP-layer block of an already-produced billable leaf (what is produced/billed is governed by max_variants/max_creatives/max_spend). Distinct from `rank_by`: the gate is a pass/fail predicate (drop on fail), `rank_by` is an ordering over survivors. Each predicate's `if_not_covered` (exclude|include, default exclude) is the fail-open knob when the source cannot measure that feature. A pass/warn/fail verdict is expressed as a categorical string feature value gated via `allowed_values` (e.g. [\"pass\"] or [\"pass\",\"warn\"]) — the buyer's predicate decides whether warn passes; the verdict is derived, never stored on creative-feature-result. Omit to leave evaluation advisory (no leaf is dropped).", "items": { "$ref": "/schemas/core/feature-requirement.json" @@ -16,12 +17,14 @@ }, "rank_by": { "type": "array", + "maxItems": 100, "description": "Optional RANK ordering over creative-feature values — an ordered list (most significant first) the agent uses to order the gate survivors into recommended/rank. An explicit {feature_id, direction} ordering rather than the feature-requirement predicate (which has no sort direction): the gate decides pass/fail, rank_by decides better/worse. Soft preference, never a gate: leaves are not dropped by rank_by, they are only ordered. Omit to let the evaluator/seller choose the ordering.", "items": { "type": "object", "properties": { "feature_id": { "type": "string", + "maxLength": 255, "description": "Creative feature to order by (discovered via get_adcp_capabilities; the same feature_id space the chosen evaluator form returns in eval.features[])." }, "direction": { @@ -48,6 +51,7 @@ }, "feature_id": { "type": "string", + "maxLength": 255, "description": "Optional canonical feature_id the producing agent SHOULD request against this agent. When present it SHOULD match the agent's `accepted_verifiers[].feature_id` or be omitted; when absent the seller selects a feature at evaluation time. Resolves selector ambiguity exactly as the provenance verify_agent.feature_id does." } }, @@ -89,6 +93,7 @@ "properties": { "pass": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/content-standards/artifact.json" }, @@ -96,6 +101,7 @@ }, "fail": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/content-standards/artifact.json" }, diff --git a/static/schemas/source/core/execution-requirement-readiness.json b/static/schemas/source/core/execution-requirement-readiness.json index e667e4c3689..0593dd0389b 100644 --- a/static/schemas/source/core/execution-requirement-readiness.json +++ b/static/schemas/source/core/execution-requirement-readiness.json @@ -15,6 +15,7 @@ }, "binding_field": { "type": "string", + "maxLength": 500, "minLength": 1, "description": "Where the buyer binds the resource, in the form of `error.field`. Omitted for `downstream_connection`. For `event_source` and `catalog`, SHOULD be present when `ready` or `selection_required`." }, @@ -24,11 +25,13 @@ "properties": { "resource_id": { "type": "string", + "maxLength": 255, "minLength": 1, "description": "Directly usable in `binding_field`: the `event_source_id` from `sync_event_sources` (including a seller-managed source) or a `catalog_id`. Never a raw platform ID unless that is what the field accepts." }, "name": { "type": "string", + "maxLength": 255, "description": "Human-readable name of the resource on the seller's platform." }, "ext": { @@ -40,17 +43,20 @@ }, "candidates": { "type": "array", + "maxItems": 100, "description": "Resources the account has, when `selection_required`, for `event_source` and `catalog`. Account-scoped, never disclosed across accounts. Lists resources the seller has no evidence would fail the requirement; MAY include one whose event types or catalog type it cannot verify.", "items": { "type": "object", "properties": { "resource_id": { "type": "string", + "maxLength": 255, "minLength": 1, "description": "Directly usable in `binding_field`, as for `resolved.resource_id`." }, "name": { "type": "string", + "maxLength": 255, "description": "Human-readable name of the resource on the seller's platform." }, "ext": { @@ -74,6 +80,7 @@ }, "issues": { "type": "array", + "maxItems": 100, "description": "Actionable detail for a non-`ready` status. SHOULD be limited to the 3-5 most actionable items.", "items": { "$ref": "/schemas/core/diagnostic-issue.json" diff --git a/static/schemas/source/core/hold-policy.json b/static/schemas/source/core/hold-policy.json index fd1a78611fc..2bb255e15b3 100644 --- a/static/schemas/source/core/hold-policy.json +++ b/static/schemas/source/core/hold-policy.json @@ -72,6 +72,7 @@ "definitions": { "positive_duration": { "type": "string", + "maxLength": 64, "pattern": "^P(?=.*[1-9])(?=\\d|T)(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$", "description": "Strictly positive ISO 8601 duration using only days, hours, minutes, and seconds, such as P2D or PT36H. A day is exactly 24 hours of elapsed time on the UTC instant. Year, month, and week parts are excluded so a duration never depends on calendar length." } diff --git a/static/schemas/source/core/installment-publication.json b/static/schemas/source/core/installment-publication.json index f9cb4c3fa66..df7c1acd078 100644 --- a/static/schemas/source/core/installment-publication.json +++ b/static/schemas/source/core/installment-publication.json @@ -15,6 +15,7 @@ }, "posts": { "type": "array", + "maxItems": 100, "minItems": 1, "x-added-in": "3.3.0", "items": { "$ref": "/schemas/core/assets/published-post-asset.json" }, diff --git a/static/schemas/source/core/invoice-line.json b/static/schemas/source/core/invoice-line.json index 341d7ebdac3..d055b0d54dd 100644 --- a/static/schemas/source/core/invoice-line.json +++ b/static/schemas/source/core/invoice-line.json @@ -9,18 +9,21 @@ "properties": { "media_buy_id": { "type": "string", + "maxLength": 255, "minLength": 1, "description": "Seller's identifier of the media buy this line bills.", "x-entity": "media_buy" }, "package_id": { "type": "string", + "maxLength": 255, "minLength": 1, "description": "Package within the media buy this line bills. Omit when the line covers the media buy as a whole.", "x-entity": "package" }, "reporting_revision_ids": { "type": "array", + "maxItems": 1000, "description": "Official reporting revisions this line bills from. Each MUST belong to this line's media_buy_id (and package_id when present) and MUST be an official revision (enums/reporting-finality.json); a snapshot revision is provisional and is not invoice-addressable. A line MAY carry both revisions and adjustments; reporting_revision_ids and reporting_adjustment_ids are opaque references from the media_buy.reporting_delivery surface, and the seller's billing system, not this schema, defines how they net into billed_quantity and amount.", "items": { "type": "string", @@ -34,6 +37,7 @@ }, "reporting_adjustment_ids": { "type": "array", + "maxItems": 1000, "description": "Reporting adjustments this line applies (each MUST belong to this line's media_buy_id and package_id when present), for post-official corrections billed in a later period than the revision they adjust.", "items": { "type": "string", diff --git a/static/schemas/source/core/media-buy-issue.json b/static/schemas/source/core/media-buy-issue.json index b994b8c6e6c..495a4a11596 100644 --- a/static/schemas/source/core/media-buy-issue.json +++ b/static/schemas/source/core/media-buy-issue.json @@ -8,21 +8,25 @@ "properties": { "issue_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-entity": "media_buy_issue" }, "media_buy_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-entity": "media_buy" }, "package_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-entity": "package" }, "creative_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-entity": "creative" }, diff --git a/static/schemas/source/core/media-buy.json b/static/schemas/source/core/media-buy.json index aec4e858623..968ff8838d2 100644 --- a/static/schemas/source/core/media-buy.json +++ b/static/schemas/source/core/media-buy.json @@ -171,6 +171,7 @@ "x-status": "experimental", "x-added-in": "3.3.0", "type": "string", + "maxLength": 255, "x-entity": "media_buy", "description": "Media buy this one succeeds, as set at creation. Same seller and account; the predecessor carries no reverse link and may no longer be retrievable. Sellers MUST echo it for buys created with it. Experimental in AdCP 3.3 (`media_buy.lineage`)." }, diff --git a/static/schemas/source/core/performance-feedback-assertion.json b/static/schemas/source/core/performance-feedback-assertion.json index 8251646588e..94dd80776d9 100644 --- a/static/schemas/source/core/performance-feedback-assertion.json +++ b/static/schemas/source/core/performance-feedback-assertion.json @@ -8,18 +8,21 @@ "properties": { "media_buy_id": { "type": "string", + "maxLength": 255, "minLength": 1, "description": "Receiver-scoped media buy identifier. On the provider-to-orchestrator hop this is the orchestrator's measurement-facing identifier; on the orchestrator-to-seller hop it is the seller-assigned media buy identifier.", "x-entity": "media_buy" }, "package_id": { "type": "string", + "maxLength": 255, "minLength": 1, "description": "Receiver-scoped package identifier when the assertion is package-specific. The orchestrator maps its measurement-facing identifier to seller-local identifiers during fan-out.", "x-entity": "package" }, "creative_id": { "type": "string", + "maxLength": 255, "minLength": 1, "description": "Receiver-scoped creative identifier when the assertion is creative-specific. The orchestrator maps its measurement-facing identifier to seller-local identifiers during fan-out.", "x-entity": "creative" @@ -129,6 +132,7 @@ }, "supersedes_feedback_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-status": "experimental", "description": "Receiver-issued feedback_id of the earlier assertion this one replaces at the same hop." diff --git a/static/schemas/source/core/placement-definition.json b/static/schemas/source/core/placement-definition.json index 6d3259c69e9..b5d150b5910 100644 --- a/static/schemas/source/core/placement-definition.json +++ b/static/schemas/source/core/placement-definition.json @@ -21,10 +21,10 @@ "type": "object", "description": "Structured street address for a DOOH/OOH placement, for display and geocoding fallback when coordinates are absent or imprecise.", "properties": { - "line1": { "type": "string", "description": "Street address line (e.g., '89 E 42nd St')." }, - "city": { "type": "string", "description": "City name." }, - "region": { "type": "string", "description": "State, province, or region. ISO 3166-2 subdivision code preferred (e.g., 'US-NY')." }, - "postal_code": { "type": "string", "description": "Postal or ZIP code." }, + "line1": { "type": "string", "maxLength": 200, "description": "Street address line (e.g., '89 E 42nd St')." }, + "city": { "type": "string", "maxLength": 100, "description": "City name." }, + "region": { "type": "string", "maxLength": 64, "description": "State, province, or region. ISO 3166-2 subdivision code preferred (e.g., 'US-NY')." }, + "postal_code": { "type": "string", "maxLength": 64, "description": "Postal or ZIP code." }, "country": { "type": "string", "pattern": "^[A-Z]{2}$", "description": "ISO 3166-1 alpha-2 country code." } }, "additionalProperties": false diff --git a/static/schemas/source/core/placement-evidence.json b/static/schemas/source/core/placement-evidence.json index 3ff351fb983..82216b8da42 100644 --- a/static/schemas/source/core/placement-evidence.json +++ b/static/schemas/source/core/placement-evidence.json @@ -31,6 +31,7 @@ }, "notes": { "type": "string", + "maxLength": 2000, "description": "Context that doesn't fit the structured fields (e.g., 'shot from the eastbound approach at 40mph equivalent')" } }, diff --git a/static/schemas/source/core/placement.json b/static/schemas/source/core/placement.json index b0712e9d91e..ecce0c50aa7 100644 --- a/static/schemas/source/core/placement.json +++ b/static/schemas/source/core/placement.json @@ -21,10 +21,10 @@ "type": "object", "description": "Structured street address for a DOOH/OOH placement, for display and geocoding fallback when coordinates are absent or imprecise.", "properties": { - "line1": { "type": "string", "description": "Street address line (e.g., '89 E 42nd St')." }, - "city": { "type": "string", "description": "City name." }, - "region": { "type": "string", "description": "State, province, or region. ISO 3166-2 subdivision code preferred (e.g., 'US-NY')." }, - "postal_code": { "type": "string", "description": "Postal or ZIP code." }, + "line1": { "type": "string", "maxLength": 200, "description": "Street address line (e.g., '89 E 42nd St')." }, + "city": { "type": "string", "maxLength": 100, "description": "City name." }, + "region": { "type": "string", "maxLength": 64, "description": "State, province, or region. ISO 3166-2 subdivision code preferred (e.g., 'US-NY')." }, + "postal_code": { "type": "string", "maxLength": 64, "description": "Postal or ZIP code." }, "country": { "type": "string", "pattern": "^[A-Z]{2}$", "description": "ISO 3166-1 alpha-2 country code." } }, "additionalProperties": false diff --git a/static/schemas/source/core/principal-declarations-state.json b/static/schemas/source/core/principal-declarations-state.json index e144d4f3288..682119907b4 100644 --- a/static/schemas/source/core/principal-declarations-state.json +++ b/static/schemas/source/core/principal-declarations-state.json @@ -16,6 +16,7 @@ }, "selected_async_adcp_version": { "type": "string", + "maxLength": 64, "pattern": "^\\d+\\.\\d+$", "description": "The single AdCP minor version the seller will use for asynchronous payload shapes toward this principal. MUST be a member of accepted.async_adcp_versions and MUST be present whenever that set is non-empty, so the buyer knows the exact payload contract rather than inferring it from the intersection." }, diff --git a/static/schemas/source/core/principal-declarations.json b/static/schemas/source/core/principal-declarations.json index fb703d725a5..b47f293764a 100644 --- a/static/schemas/source/core/principal-declarations.json +++ b/static/schemas/source/core/principal-declarations.json @@ -10,6 +10,7 @@ "type": "array", "items": { "type": "string", + "maxLength": 64, "pattern": "^\\d+\\.\\d+$" }, "minItems": 1, @@ -19,6 +20,7 @@ }, "webhook_signing_algorithms": { "type": "array", + "maxItems": 32, "items": { "type": "string", "enum": ["ed25519", "ecdsa-p256-sha256"] diff --git a/static/schemas/source/core/principal-relationship.json b/static/schemas/source/core/principal-relationship.json index 6f48a694951..d9d1bc34870 100644 --- a/static/schemas/source/core/principal-relationship.json +++ b/static/schemas/source/core/principal-relationship.json @@ -27,6 +27,7 @@ }, "message": { "type": "string", + "maxLength": 2000, "description": "Human-readable description of what is needed." }, "expires_at": { diff --git a/static/schemas/source/core/product-execution-readiness.json b/static/schemas/source/core/product-execution-readiness.json index 3fee5d15b45..0c4f86cff0e 100644 --- a/static/schemas/source/core/product-execution-readiness.json +++ b/static/schemas/source/core/product-execution-readiness.json @@ -11,6 +11,7 @@ }, "requirements": { "type": "array", + "maxItems": 100, "description": "Readiness of each declared `execution_requirements[]` entry, once each. A seller that did not evaluate one reports it `unknown` with `unknown_reason: not_evaluated`.", "items": { "$ref": "/schemas/core/execution-requirement-readiness.json" diff --git a/static/schemas/source/core/product-filters.json b/static/schemas/source/core/product-filters.json index 4981eea41c4..d4c64acc38c 100644 --- a/static/schemas/source/core/product-filters.json +++ b/static/schemas/source/core/product-filters.json @@ -255,6 +255,7 @@ }, "audience_activation_methods": { "type": "array", + "maxItems": 32, "x-status": "experimental", "description": "Filter to products whose audience_activation.methods matches at least one requested entry (OR across entries). Within an entry every specified field must match (AND); omitted optional fields are wildcards; directions matches on non-empty intersection, and a method that omits directions matches any requested directions; vendor matches on domain, plus brand_id when specified. Fields inapplicable to the requested pattern (e.g. transport on a clean_room entry) make that entry unsatisfiable. Sellers MUST exclude products with no audience_activation declaration when this filter is present; exclusions MAY be reported via filter_diagnostics.excluded_by. Experimental: part of the media_buy.audience_activation surface — buyers SHOULD check the seller's experimental_features before filtering on it; sellers that do not list the feature ignore this filter.", "items": { @@ -297,6 +298,7 @@ }, "directions": { "type": "array", + "maxItems": 32, "description": "Require a non-empty intersection with the method's declared directions (file_transfer only).", "items": { "type": "string", diff --git a/static/schemas/source/core/product-identity.json b/static/schemas/source/core/product-identity.json index b4ce61a3b24..9014861427f 100644 --- a/static/schemas/source/core/product-identity.json +++ b/static/schemas/source/core/product-identity.json @@ -23,11 +23,13 @@ }, "reach_methodology": { "type": "string", + "maxLength": 2000, "minLength": 1, "description": "Human-readable methodology for this product's custom reach unit. Required when the product reports reach or frequency with reach_unit custom, including frequency-only reporting." }, "match_keys": { "type": "array", + "maxItems": 64, "x-added-in": "3.3.0", "description": "Identifiers this product resolves, with scopes and uses. When present, authoritative for this product over media_buy.supported_match_keys, and each entry MUST be covered by a seller-wide entry with the same uid_type and vendor. Keys inherit the product's channels and property types; a seller whose resolution differs across them MUST split the product or omit the key. Requires media_buy.match_keys in experimental_features. When persistent_identifier is false, no entry may list frequency_cap or identity_match; an identity_match entry requires trusted_match.identity_match: true.", "items": { diff --git a/static/schemas/source/core/product.json b/static/schemas/source/core/product.json index 4120c9d4c7a..6eddb51964d 100644 --- a/static/schemas/source/core/product.json +++ b/static/schemas/source/core/product.json @@ -652,6 +652,7 @@ "properties": { "methods": { "type": "array", + "maxItems": 32, "description": "Activation capabilities available on this product, as an unordered set. Entries are usually independent options; a clean_room entry may compose with dataset_query or platform_distribution to declare how a targetable result leaves the room or reaches the buying platform.", "items": { "$ref": "/schemas/core/audience-activation-method.json" @@ -664,6 +665,7 @@ }, "notes": { "type": "string", + "maxLength": 2000, "description": "Free-text caveats (onboarding lead times, data-format constraints, regional restrictions)." } }, diff --git a/static/schemas/source/core/proposal-offered-webhook.json b/static/schemas/source/core/proposal-offered-webhook.json index 5e237d83c98..88b023e2325 100644 --- a/static/schemas/source/core/proposal-offered-webhook.json +++ b/static/schemas/source/core/proposal-offered-webhook.json @@ -37,10 +37,12 @@ }, "account_id": { "type": "string", + "maxLength": 255, "x-entity": "account" }, "media_buy_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-entity": "media_buy" }, diff --git a/static/schemas/source/core/reporting-adjustment-receipt.json b/static/schemas/source/core/reporting-adjustment-receipt.json index b508928881f..5207887d393 100644 --- a/static/schemas/source/core/reporting-adjustment-receipt.json +++ b/static/schemas/source/core/reporting-adjustment-receipt.json @@ -20,7 +20,7 @@ "supersedes_reporting_receipt_id": { "type": "string", "minLength": 16, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{16,255}$", "x-entity": "reporting_receipt", "description": "Optional immutable rejected receipt replaced by this new receipt for the same adjustment. Accepted current receipts are terminal." }, "status": { "type": "string", "enum": ["accepted", "rejected"] }, "observed_adjustment_sha256": { "type": "string", "pattern": "^[A-Fa-f0-9]{64}$", "description": "Digest recomputed from the adjustment using its canonical evidence rule." }, - "rejection_codes": { "type": "array", "items": { "$ref": "#/definitions/ReportingAdjustmentRejectionCode" }, "minItems": 1, "uniqueItems": true }, + "rejection_codes": { "type": "array", "maxItems": 100, "items": { "$ref": "#/definitions/ReportingAdjustmentRejectionCode" }, "minItems": 1, "uniqueItems": true }, "observed_at": { "type": "string", "format": "date-time" }, "received_at": { "type": "string", "format": "date-time", "readOnly": true } }, diff --git a/static/schemas/source/core/reporting-adjustment.json b/static/schemas/source/core/reporting-adjustment.json index 3845211210b..05733b82c2c 100644 --- a/static/schemas/source/core/reporting-adjustment.json +++ b/static/schemas/source/core/reporting-adjustment.json @@ -26,6 +26,7 @@ }, "control_total_deltas": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/core/reporting-control-total.json" }, "minItems": 1, "uniqueItems": true, diff --git a/static/schemas/source/core/reporting-canonicalization-contract.json b/static/schemas/source/core/reporting-canonicalization-contract.json index dacbbd2bde7..dfc9f4c408c 100644 --- a/static/schemas/source/core/reporting-canonicalization-contract.json +++ b/static/schemas/source/core/reporting-canonicalization-contract.json @@ -21,6 +21,7 @@ "schema_sha256": { "type": "string", "pattern": "^[A-Fa-f0-9]{64}$", "description": "Digest of the exact row schema to which this contract applies." }, "primary_keys": { "type": "array", + "maxItems": 32, "items": { "$ref": "#/definitions/ReportingPrimaryKey" }, "minItems": 1, "uniqueItems": true, @@ -48,8 +49,8 @@ "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 128, "pattern": "^[A-Za-z0-9_.:-]{1,128}$" }, "purpose": { "type": "string", "const": "ordering_encoding" }, - "input_rows": { "type": "array", "items": { "type": "object" }, "minItems": 2 }, - "canonical_utf8_base64": { "type": "string", "minLength": 1, "description": "Base64 of the exact expected canonical UTF-8 bytes." }, + "input_rows": { "type": "array", "maxItems": 10000, "items": { "type": "object" }, "minItems": 2 }, + "canonical_utf8_base64": { "type": "string", "maxLength": 1048576, "minLength": 1, "description": "Base64 of the exact expected canonical UTF-8 bytes." }, "sha256": { "type": "string", "pattern": "^[A-Fa-f0-9]{64}$" } }, "required": ["name", "purpose", "input_rows", "canonical_utf8_base64", "sha256"], @@ -57,14 +58,15 @@ }, "additional": { "type": "array", + "maxItems": 100, "items": { "title": "AdditionalGoldenVector", "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 128, "pattern": "^[A-Za-z0-9_.:-]{1,128}$" }, "purpose": { "type": "string", "const": "additional" }, - "input_rows": { "type": "array", "items": { "type": "object" } }, - "canonical_utf8_base64": { "type": "string", "minLength": 1, "description": "Base64 of the exact expected canonical UTF-8 bytes." }, + "input_rows": { "type": "array", "maxItems": 10000, "items": { "type": "object" } }, + "canonical_utf8_base64": { "type": "string", "maxLength": 1048576, "minLength": 1, "description": "Base64 of the exact expected canonical UTF-8 bytes." }, "sha256": { "type": "string", "pattern": "^[A-Fa-f0-9]{64}$" } }, "required": ["name", "purpose", "input_rows", "canonical_utf8_base64", "sha256"], diff --git a/static/schemas/source/core/reporting-capabilities.json b/static/schemas/source/core/reporting-capabilities.json index 89e2b3bf592..4a4df98b8d2 100644 --- a/static/schemas/source/core/reporting-capabilities.json +++ b/static/schemas/source/core/reporting-capabilities.json @@ -145,6 +145,7 @@ }, "available_installment_statuses": { "type": "array", + "maxItems": 32, "x-status": "experimental", "x-added-in": "3.3.0", "items": { "$ref": "/schemas/enums/installment-status.json" }, diff --git a/static/schemas/source/core/reporting-consumer-status.json b/static/schemas/source/core/reporting-consumer-status.json index 566a169717f..c0177553ead 100644 --- a/static/schemas/source/core/reporting-consumer-status.json +++ b/static/schemas/source/core/reporting-consumer-status.json @@ -57,7 +57,7 @@ "properties": { "start": { "type": "string", "format": "date-time" }, "end": { "type": "string", "format": "date-time" }, - "source_timezone": { "type": "string", "minLength": 1 } + "source_timezone": { "type": "string", "maxLength": 64, "minLength": 1 } }, "required": ["start", "end", "source_timezone"], "additionalProperties": false diff --git a/static/schemas/source/core/reporting-control-total.json b/static/schemas/source/core/reporting-control-total.json index 2c282080799..14f3d3987f2 100644 --- a/static/schemas/source/core/reporting-control-total.json +++ b/static/schemas/source/core/reporting-control-total.json @@ -17,6 +17,7 @@ }, "value": { "type": "string", + "maxLength": 255, "pattern": "^-?(?:0|[1-9][0-9]*)$", "description": "Canonical base-10 integer with no exponent, grouping separator, decimal point, or insignificant leading zeroes." }, @@ -43,6 +44,7 @@ }, "value": { "type": "string", + "maxLength": 255, "pattern": "^-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?$", "description": "Canonical base-10 decimal with no exponent, grouping separator, or insignificant leading zeroes." }, diff --git a/static/schemas/source/core/reporting-coverage.json b/static/schemas/source/core/reporting-coverage.json index fbb256dfdfb..8f0dae673cc 100644 --- a/static/schemas/source/core/reporting-coverage.json +++ b/static/schemas/source/core/reporting-coverage.json @@ -10,6 +10,7 @@ "title": "Reporting Media Buy ID", "x-adcp-model-context-inline": true, "type": "string", + "maxLength": 500, "minLength": 1, "x-entity": "media_buy" }, @@ -17,6 +18,7 @@ "title": "Reporting Package ID", "x-adcp-model-context-inline": true, "type": "string", + "maxLength": 500, "minLength": 1, "x-entity": "package" } @@ -24,24 +26,25 @@ "properties": { "status": { "type": "string", "enum": ["full", "partial", "none", "unknown"] }, "evaluated_at": { "type": "string", "format": "date-time" }, - "media_buy_ids": { "type": "array", "items": { "$ref": "#/definitions/ReportingMediaBuyId" }, "uniqueItems": true, "description": "Exact media-buy denominator, including unsupported and unknown buys. An empty array is an explicitly evaluated zero-buy scope." }, - "fully_covered_media_buy_ids": { "type": "array", "items": { "$ref": "#/definitions/ReportingMediaBuyId" }, "uniqueItems": true }, - "partially_covered_media_buy_ids": { "type": "array", "items": { "$ref": "#/definitions/ReportingMediaBuyId" }, "uniqueItems": true }, - "unsupported_media_buy_ids": { "type": "array", "items": { "$ref": "#/definitions/ReportingMediaBuyId" }, "uniqueItems": true }, - "unknown_media_buy_ids": { "type": "array", "items": { "$ref": "#/definitions/ReportingMediaBuyId" }, "uniqueItems": true }, - "package_ids": { "type": "array", "items": { "$ref": "#/definitions/ReportingPackageId" }, "uniqueItems": true, "description": "Exact package denominator for the evaluated media buys." }, - "covered_package_ids": { "type": "array", "items": { "$ref": "#/definitions/ReportingPackageId" }, "uniqueItems": true }, - "unsupported_package_ids": { "type": "array", "items": { "$ref": "#/definitions/ReportingPackageId" }, "uniqueItems": true }, - "unknown_package_ids": { "type": "array", "items": { "$ref": "#/definitions/ReportingPackageId" }, "uniqueItems": true }, + "media_buy_ids": { "type": "array", "maxItems": 1000, "items": { "$ref": "#/definitions/ReportingMediaBuyId" }, "uniqueItems": true, "description": "Exact media-buy denominator, including unsupported and unknown buys. An empty array is an explicitly evaluated zero-buy scope." }, + "fully_covered_media_buy_ids": { "type": "array", "maxItems": 1000, "items": { "$ref": "#/definitions/ReportingMediaBuyId" }, "uniqueItems": true }, + "partially_covered_media_buy_ids": { "type": "array", "maxItems": 1000, "items": { "$ref": "#/definitions/ReportingMediaBuyId" }, "uniqueItems": true }, + "unsupported_media_buy_ids": { "type": "array", "maxItems": 1000, "items": { "$ref": "#/definitions/ReportingMediaBuyId" }, "uniqueItems": true }, + "unknown_media_buy_ids": { "type": "array", "maxItems": 1000, "items": { "$ref": "#/definitions/ReportingMediaBuyId" }, "uniqueItems": true }, + "package_ids": { "type": "array", "maxItems": 1000, "items": { "$ref": "#/definitions/ReportingPackageId" }, "uniqueItems": true, "description": "Exact package denominator for the evaluated media buys." }, + "covered_package_ids": { "type": "array", "maxItems": 1000, "items": { "$ref": "#/definitions/ReportingPackageId" }, "uniqueItems": true }, + "unsupported_package_ids": { "type": "array", "maxItems": 1000, "items": { "$ref": "#/definitions/ReportingPackageId" }, "uniqueItems": true }, + "unknown_package_ids": { "type": "array", "maxItems": 1000, "items": { "$ref": "#/definitions/ReportingPackageId" }, "uniqueItems": true }, "limitations": { "type": "array", + "maxItems": 100, "description": "Stable reasons that some requested scope is not covered by the exact selected offering. These are capability facts, not delivery failures.", "items": { "type": "object", "properties": { "reason": { "type": "string", "enum": ["offering_unsupported", "account_entitlement_unavailable", "credential_scope_insufficient", "provider_limitation", "capability_unknown"] }, "media_buy_id": { "$ref": "#/definitions/ReportingMediaBuyId" }, - "package_ids": { "type": "array", "items": { "$ref": "#/definitions/ReportingPackageId" }, "minItems": 1, "uniqueItems": true } + "package_ids": { "type": "array", "maxItems": 1000, "items": { "$ref": "#/definitions/ReportingPackageId" }, "minItems": 1, "uniqueItems": true } }, "required": ["reason", "media_buy_id"], "additionalProperties": false diff --git a/static/schemas/source/core/reporting-dataset-share-destination.json b/static/schemas/source/core/reporting-dataset-share-destination.json index 45943485681..eb541c850b2 100644 --- a/static/schemas/source/core/reporting-dataset-share-destination.json +++ b/static/schemas/source/core/reporting-dataset-share-destination.json @@ -27,7 +27,7 @@ "title": "Provision recipient", "properties": { "mode": { "type": "string", "const": "provision" }, - "provider": { "type": "object", "description": "Data-sharing platform, such as databricks.com or snowflake.com.", "properties": { "domain": { "type": "string", "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" } }, "required": ["domain"], "additionalProperties": false }, + "provider": { "type": "object", "description": "Data-sharing platform, such as databricks.com or snowflake.com.", "properties": { "domain": { "type": "string", "maxLength": 253, "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" } }, "required": ["domain"], "additionalProperties": false }, "access_mode": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[a-z][a-z0-9_.-]*$", "description": "Provider access family, such as databricks_to_databricks, open_sharing, or secure_data_sharing." }, "recipient": { "type": "object", diff --git a/static/schemas/source/core/reporting-delivery-config-state.json b/static/schemas/source/core/reporting-delivery-config-state.json index f1045b56ca1..d5f97d26a6f 100644 --- a/static/schemas/source/core/reporting-delivery-config-state.json +++ b/static/schemas/source/core/reporting-delivery-config-state.json @@ -96,6 +96,7 @@ }, "issues": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/core/reporting-status-issue.json" }, diff --git a/static/schemas/source/core/reporting-delivery-config.json b/static/schemas/source/core/reporting-delivery-config.json index c7c04ca8417..80a98f6ce78 100644 --- a/static/schemas/source/core/reporting-delivery-config.json +++ b/static/schemas/source/core/reporting-delivery-config.json @@ -18,7 +18,7 @@ "description": "Media buys covered by this configuration.", "properties": { "all_media_buys": { "type": "boolean", "const": true }, - "media_buy_ids": { "type": "array", "items": { "$ref": "/schemas/core/reporting-coverage.json#/definitions/ReportingMediaBuyId" }, "minItems": 1, "uniqueItems": true } + "media_buy_ids": { "type": "array", "maxItems": 1000, "items": { "$ref": "/schemas/core/reporting-coverage.json#/definitions/ReportingMediaBuyId" }, "minItems": 1, "uniqueItems": true } }, "minProperties": 1, "maxProperties": 1, diff --git a/static/schemas/source/core/reporting-delivery-ready-webhook.json b/static/schemas/source/core/reporting-delivery-ready-webhook.json index 171c800fcde..d2160d19172 100644 --- a/static/schemas/source/core/reporting-delivery-ready-webhook.json +++ b/static/schemas/source/core/reporting-delivery-ready-webhook.json @@ -36,6 +36,7 @@ }, "account_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-entity": "account" }, diff --git a/static/schemas/source/core/reporting-file-manifest.json b/static/schemas/source/core/reporting-file-manifest.json index f1747cfedb4..cd380d43094 100644 --- a/static/schemas/source/core/reporting-file-manifest.json +++ b/static/schemas/source/core/reporting-file-manifest.json @@ -16,7 +16,7 @@ "properties": { "start": { "type": "string", "format": "date-time" }, "end": { "type": "string", "format": "date-time" }, - "source_timezone": { "type": "string", "minLength": 1 } + "source_timezone": { "type": "string", "maxLength": 64, "minLength": 1 } }, "required": ["start", "end", "source_timezone"], "additionalProperties": false @@ -25,6 +25,7 @@ "compression": { "$ref": "/schemas/core/reporting-file-compression.json" }, "files": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/core/reporting-file-entry.json" }, "minItems": 1 }, @@ -32,6 +33,7 @@ "row_count": { "type": "integer", "minimum": 0 }, "control_totals": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/core/reporting-control-total.json" }, "uniqueItems": true }, diff --git a/static/schemas/source/core/reporting-ledger-changed-webhook.json b/static/schemas/source/core/reporting-ledger-changed-webhook.json index 657499d94e9..f9649425579 100644 --- a/static/schemas/source/core/reporting-ledger-changed-webhook.json +++ b/static/schemas/source/core/reporting-ledger-changed-webhook.json @@ -11,7 +11,7 @@ "notification_type": { "type": "string", "const": "reporting.ledger_changed" }, "fired_at": { "type": "string", "format": "date-time" }, "subscriber_id": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[A-Za-z0-9_.:-]{1,64}$" }, - "account_id": { "type": "string", "minLength": 1, "x-entity": "account" }, + "account_id": { "type": "string", "maxLength": 255, "minLength": 1, "x-entity": "account" }, "change_kind": { "type": "string", "enum": ["revision_published", "adjustment_published"] }, "reporting_revision_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_revision" }, "supersedes_reporting_revision_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_revision" }, diff --git a/static/schemas/source/core/reporting-obligation.json b/static/schemas/source/core/reporting-obligation.json index 024c350e1f4..5b70c3d8939 100644 --- a/static/schemas/source/core/reporting-obligation.json +++ b/static/schemas/source/core/reporting-obligation.json @@ -58,11 +58,13 @@ }, "account_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-entity": "account" }, "media_buy_ids": { "type": "array", + "maxItems": 1000, "items": { "$ref": "/schemas/core/reporting-coverage.json#/definitions/ReportingMediaBuyId" }, @@ -91,6 +93,7 @@ }, "source_timezone": { "type": "string", + "maxLength": 64, "minLength": 1 } }, @@ -193,6 +196,7 @@ "pending_adjustment_count": { "type": "integer", "minimum": 0, "description": "Number of applicable adjustments without an accepted receipt. Reconciled Billing complete/healthy requires zero." }, "issues": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/core/reporting-status-issue.json" } diff --git a/static/schemas/source/core/reporting-receipt.json b/static/schemas/source/core/reporting-receipt.json index 8c916ca5d6b..dc158547dfd 100644 --- a/static/schemas/source/core/reporting-receipt.json +++ b/static/schemas/source/core/reporting-receipt.json @@ -16,6 +16,7 @@ "observed_row_count": { "type": "integer", "minimum": 0 }, "observed_control_totals": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/core/reporting-control-total.json" }, "uniqueItems": true }, @@ -25,6 +26,7 @@ "consumer_commit_ref": { "type": "string", "minLength": 1, "maxLength": 512, "description": "Optional non-secret consumer checkpoint, transaction, or load identifier. It is evidence for operations, not authorization or a credential." }, "rejection_codes": { "type": "array", + "maxItems": 100, "items": { "type": "string", "minLength": 1, "maxLength": 128, "pattern": "^[A-Z][A-Z0-9_]*$" }, "minItems": 1, "uniqueItems": true diff --git a/static/schemas/source/core/reporting-report-definition.json b/static/schemas/source/core/reporting-report-definition.json index 941dc2319a5..06839ec85ba 100644 --- a/static/schemas/source/core/reporting-report-definition.json +++ b/static/schemas/source/core/reporting-report-definition.json @@ -23,7 +23,7 @@ "source": { "type": "object", "properties": { - "provider": { "type": "object", "properties": { "domain": { "type": "string", "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" } }, "required": ["domain"], "additionalProperties": false }, + "provider": { "type": "object", "properties": { "domain": { "type": "string", "maxLength": 253, "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" } }, "required": ["domain"], "additionalProperties": false }, "system": { "type": "string", "minLength": 1, "maxLength": 128 }, "api_version": { "type": "string", "minLength": 1, "maxLength": 128 }, "query_semantics": { "type": "object", "description": "Canonical JSON object containing every source option that can change the numbers, including attribution settings, action-report-time, filters, and mapping version." }, @@ -46,6 +46,7 @@ }, "metrics": { "type": "array", + "maxItems": 32, "items": { "type": "object", "properties": { @@ -59,11 +60,11 @@ }, "minItems": 1 }, - "dimensions": { "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 128 }, "uniqueItems": true }, + "dimensions": { "type": "array", "maxItems": 32, "items": { "type": "string", "minLength": 1, "maxLength": 128 }, "uniqueItems": true }, "restatement_policy": { "type": "object", "properties": { - "source_requery_duration": { "type": "string", "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" }, + "source_requery_duration": { "type": "string", "maxLength": 255, "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" }, "emit_only_on_content_change": { "type": "boolean", "const": true }, "official_correction_mode": { "type": "string", "const": "adjustments_only", "description": "Once an official revision is published it is immutable and cannot be superseded. Later source corrections are separate reporting-adjustment records applied to a later accounting period." } }, @@ -72,6 +73,7 @@ }, "finality_policies": { "type": "array", + "maxItems": 100, "items": { "oneOf": [ { @@ -89,7 +91,7 @@ "properties": { "finality_policy_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$" }, "basis": { "type": "string", "const": "contractual_cutoff" }, - "duration_after_period_end": { "type": "string", "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" } + "duration_after_period_end": { "type": "string", "maxLength": 255, "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" } }, "required": ["finality_policy_id", "basis", "duration_after_period_end"], "additionalProperties": false @@ -99,8 +101,8 @@ "properties": { "finality_policy_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$" }, "basis": { "type": "string", "const": "stabilized" }, - "minimum_age": { "type": "string", "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" }, - "unchanged_for": { "type": "string", "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" } + "minimum_age": { "type": "string", "maxLength": 255, "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" }, + "unchanged_for": { "type": "string", "maxLength": 255, "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" } }, "required": ["finality_policy_id", "basis", "minimum_age", "unchanged_for"], "additionalProperties": false diff --git a/static/schemas/source/core/reporting-resource.json b/static/schemas/source/core/reporting-resource.json index e75afcf89e0..d1d9c52de48 100644 --- a/static/schemas/source/core/reporting-resource.json +++ b/static/schemas/source/core/reporting-resource.json @@ -23,7 +23,7 @@ "manifest_sha256": { "type": "string", "pattern": "^[A-Fa-f0-9]{64}$", "description": "SHA-256 over the exact manifest bytes. Consumers verify this before parsing the manifest." }, "immutability": { "type": "string", "enum": ["immutable_location", "native_version"], "description": "How this descriptor selects the exact immutable materialization." }, "expires_at": { "type": "string", "format": "date-time", "description": "Mandatory finite lower-bound endpoint through which this exact resource remains resolvable; it cannot be earlier than the advertised retention contract." }, - "reader_compatibility": { "type": "array", "description": "Reader features or format constraints required to consume this resource. Readiness verification MUST use a representative supported reader.", "items": { "$ref": "#/definitions/ReportingReaderCompatibilityItem" }, "uniqueItems": true } + "reader_compatibility": { "type": "array", "maxItems": 100, "description": "Reader features or format constraints required to consume this resource. Readiness verification MUST use a representative supported reader.", "items": { "$ref": "#/definitions/ReportingReaderCompatibilityItem" }, "uniqueItems": true } }, "required": ["resource_ref", "kind", "location", "immutability", "expires_at"], "allOf": [ diff --git a/static/schemas/source/core/reporting-revision.json b/static/schemas/source/core/reporting-revision.json index 62e324a33f6..c894d7f19f2 100644 --- a/static/schemas/source/core/reporting-revision.json +++ b/static/schemas/source/core/reporting-revision.json @@ -17,8 +17,8 @@ "schema_sha256": { "type": "string", "pattern": "^[A-Fa-f0-9]{64}$", "description": "Digest of the exact schema bytes used to validate this immutable revision." }, "schema_dialect": { "type": "string", "const": "https://json-schema.org/draft/2020-12/schema", "description": "Closed SDK-bundled dialect; the metaschema is never network-fetched." }, "schema_ref_policy": { "type": "string", "const": "local_fragment_only", "description": "The fetched schema is self-contained and every $ref is a local # fragment." }, - "account_id": { "type": "string", "minLength": 1, "x-entity": "account" }, - "media_buy_ids": { "type": "array", "items": { "$ref": "/schemas/core/reporting-coverage.json#/definitions/ReportingMediaBuyId" }, "uniqueItems": true, "description": "Exact frozen media-buy denominator inherited from the obligation, including buys with zero rows. An empty array proves a zero-buy period rather than an unknown denominator." }, + "account_id": { "type": "string", "maxLength": 255, "minLength": 1, "x-entity": "account" }, + "media_buy_ids": { "type": "array", "maxItems": 1000, "items": { "$ref": "/schemas/core/reporting-coverage.json#/definitions/ReportingMediaBuyId" }, "uniqueItems": true, "description": "Exact frozen media-buy denominator inherited from the obligation, including buys with zero rows. An empty array proves a zero-buy period rather than an unknown denominator." }, "coverage": { "$ref": "/schemas/core/reporting-coverage.json", "description": "Frozen product/package denominator represented by this logical content. The same coverage follows the revision to every destination." }, "period": { "type": "object", @@ -26,7 +26,7 @@ "properties": { "start": { "type": "string", "format": "date-time" }, "end": { "type": "string", "format": "date-time" }, - "source_timezone": { "type": "string", "minLength": 1 } + "source_timezone": { "type": "string", "maxLength": 64, "minLength": 1 } }, "required": ["start", "end", "source_timezone"], "additionalProperties": false @@ -42,6 +42,7 @@ "row_count": { "type": "integer", "minimum": 0, "description": "Logical row count, including zero for a successfully evaluated empty report." }, "control_totals": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/core/reporting-control-total.json" }, "uniqueItems": true, "description": "Profile-defined totals computed from the canonical logical revision. Names MUST be unique." diff --git a/static/schemas/source/core/reporting-schedule.json b/static/schemas/source/core/reporting-schedule.json index 3a01c54a0ea..4edf3997f15 100644 --- a/static/schemas/source/core/reporting-schedule.json +++ b/static/schemas/source/core/reporting-schedule.json @@ -15,11 +15,11 @@ } }, "properties": { - "period_duration": { "type": "string", "pattern": "^P(?=.*[1-9])(?=\\d|T)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$", "description": "Strictly positive ISO 8601 duration of each reporting period, such as PT15M, P1D, or P1M." }, + "period_duration": { "type": "string", "maxLength": 64, "pattern": "^P(?=.*[1-9])(?=\\d|T)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$", "description": "Strictly positive ISO 8601 duration of each reporting period, such as PT15M, P1D, or P1M." }, "alignment": { "$ref": "#/definitions/ReportingScheduleAlignment" }, "period_anchor": { "type": "string", "format": "date-time", "description": "Required for billing_cycle alignment. This immutable instant anchors the recurring half-open billing periods so producer and consumer derive the same month, quarter, or other contractual cycle." }, "period_timezone": { "type": "string", "minLength": 1, "maxLength": 255, "description": "Required IANA timezone for source_timezone and billing_cycle calendar arithmetic. A numeric UTC offset is not sufficient because it does not define DST transitions." }, - "delivery_sla": { "type": "string", "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$", "description": "Non-negative maximum time after period end before the required revision is due. PT0S means due at period close; expected_at equals the resolved period end plus this duration." } + "delivery_sla": { "type": "string", "maxLength": 255, "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$", "description": "Non-negative maximum time after period end before the required revision is due. PT0S means due at period close; expected_at equals the resolved period end plus this duration." } }, "required": ["period_duration", "alignment", "delivery_sla"], "allOf": [ diff --git a/static/schemas/source/core/reporting-status-changed-webhook.json b/static/schemas/source/core/reporting-status-changed-webhook.json index 61ee85751c7..3362ae556ca 100644 --- a/static/schemas/source/core/reporting-status-changed-webhook.json +++ b/static/schemas/source/core/reporting-status-changed-webhook.json @@ -37,6 +37,7 @@ }, "account_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-entity": "account" }, diff --git a/static/schemas/source/core/reporting-status-issue.json b/static/schemas/source/core/reporting-status-issue.json index d6c3392cb12..cdae8394dda 100644 --- a/static/schemas/source/core/reporting-status-issue.json +++ b/static/schemas/source/core/reporting-status-issue.json @@ -130,6 +130,7 @@ }, "media_buy_ids": { "type": "array", + "maxItems": 1000, "items": { "$ref": "/schemas/core/reporting-coverage.json#/definitions/ReportingMediaBuyId" }, @@ -138,6 +139,7 @@ }, "package_ids": { "type": "array", + "maxItems": 1000, "items": { "$ref": "/schemas/core/reporting-coverage.json#/definitions/ReportingPackageId" }, diff --git a/static/schemas/source/core/reporting-subscription-coverage.json b/static/schemas/source/core/reporting-subscription-coverage.json index 205bee50f68..5cec360b913 100644 --- a/static/schemas/source/core/reporting-subscription-coverage.json +++ b/static/schemas/source/core/reporting-subscription-coverage.json @@ -36,6 +36,7 @@ }, "excluded": { "type": "array", + "maxItems": 100, "description": "Exceptions that remove periods. An entry without media_buy_id applies to the whole account. Opening or closing one fires principal.changed with reason reporting_subscription_changed. Retained for status_retention_days after until. When the account's covered offerings have different period boundaries, the seller lists one entry per offering_id, each with that offering's cutover instants, as for gaps and timezone_cutovers.", "items": { "type": "object", @@ -85,6 +86,7 @@ }, "timezone_cutovers": { "type": "array", + "maxItems": 100, "description": "Account timezone changes affecting account_timezone-aligned periods, retained for status_retention_days. A cutover: periods under the old timezone are owed when they start before the change, so they end by effective_at; periods under the new timezone are owed when they start at or after effective_at. Any stretch from effective_at to the first new-timezone boundary is owed under neither, except on a billing offering, where it is owed as one stub period [effective_at, first new-timezone boundary) whose obligation carries stub true, so no billable hour goes unreported. Period boundaries differ between offerings, so when the account's covered offerings have different boundaries the seller lists one entry per offering_id; an entry without offering_id applies to every offering on the account.", "items": { "type": "object", @@ -100,6 +102,7 @@ }, "gaps": { "type": "array", + "maxItems": 100, "description": "Intervals between a loss of authority and re-grant that the seller did not backfill (backfill_on_regrant false or absent). Periods starting in [from, until) are not owed. With backfill_on_regrant true no gap is recorded. A re-grant after the accounts_unauthorized entry expired is a fresh coverage start from authorized_at, with no gap. Retained for status_retention_days after until. Period boundaries differ between offerings, so when the account's covered offerings have different boundaries the seller lists one entry per offering_id, each with that offering's boundaries; an entry without offering_id applies to every offering on the account.", "items": { "type": "object", diff --git a/static/schemas/source/core/reporting-subscription-state.json b/static/schemas/source/core/reporting-subscription-state.json index e44acf783fe..dafcbf4311c 100644 --- a/static/schemas/source/core/reporting-subscription-state.json +++ b/static/schemas/source/core/reporting-subscription-state.json @@ -42,11 +42,13 @@ "properties": { "account_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-entity": "account" }, "reasons": { "type": "array", + "maxItems": 32, "items": { "type": "string", "enum": [ @@ -74,6 +76,7 @@ "properties": { "account_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-entity": "account" }, diff --git a/static/schemas/source/core/reporting-subscription.json b/static/schemas/source/core/reporting-subscription.json index f19e6753e01..5211b6728ff 100644 --- a/static/schemas/source/core/reporting-subscription.json +++ b/static/schemas/source/core/reporting-subscription.json @@ -32,7 +32,7 @@ "all_authorized_accounts": { "type": "boolean", "const": true }, "account_ids": { "type": "array", - "items": { "type": "string", "minLength": 1, "x-entity": "account" }, + "items": { "type": "string", "maxLength": 255, "minLength": 1, "x-entity": "account" }, "minItems": 1, "maxItems": 1000, "uniqueItems": true @@ -44,7 +44,7 @@ }, "exclude_account_ids": { "type": "array", - "items": { "type": "string", "minLength": 1, "x-entity": "account" }, + "items": { "type": "string", "maxLength": 255, "minLength": 1, "x-entity": "account" }, "minItems": 1, "maxItems": 1000, "uniqueItems": true, diff --git a/static/schemas/source/core/reporting-verification.json b/static/schemas/source/core/reporting-verification.json index f11a8cc2b42..b4465657142 100644 --- a/static/schemas/source/core/reporting-verification.json +++ b/static/schemas/source/core/reporting-verification.json @@ -12,6 +12,7 @@ "row_count": { "type": "integer", "minimum": 0, "description": "Verified row count. Zero explicitly distinguishes an empty committed revision from a missing revision." }, "control_totals": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/core/reporting-control-total.json" }, "uniqueItems": true, "description": "Profile-defined totals recomputed through verification_path. Names MUST be unique." @@ -19,6 +20,7 @@ "canonical_content_digest": { "$ref": "/schemas/core/reporting-canonical-content-digest.json" }, "physical_checksums": { "type": "array", + "maxItems": 100, "description": "Method-specific byte/object checksums. Different encodings of the same logical revision normally have different values.", "items": { "oneOf": [ diff --git a/static/schemas/source/core/reporting-write-destination.json b/static/schemas/source/core/reporting-write-destination.json index 378f053be4e..527e17c0c97 100644 --- a/static/schemas/source/core/reporting-write-destination.json +++ b/static/schemas/source/core/reporting-write-destination.json @@ -19,7 +19,7 @@ "title": "Provision binding", "properties": { "mode": { "type": "string", "const": "provision" }, - "provider": { "type": "object", "description": "Platform hosting the destination.", "properties": { "domain": { "type": "string", "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" } }, "required": ["domain"], "additionalProperties": false }, + "provider": { "type": "object", "description": "Platform hosting the destination.", "properties": { "domain": { "type": "string", "maxLength": 253, "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" } }, "required": ["domain"], "additionalProperties": false }, "location": { "type": "string", "minLength": 1, "maxLength": 2048, "description": "Provider-native bucket, prefix, project/dataset, catalog/schema, or equivalent locator. It MUST NOT contain an embedded credential or signed URL." }, "access_mode": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[a-z][a-z0-9_.-]*$", "description": "Optional provider access family used for capability matching." } }, diff --git a/static/schemas/source/core/rights-constraint.json b/static/schemas/source/core/rights-constraint.json index f5ca6f37134..de11e0a2112 100644 --- a/static/schemas/source/core/rights-constraint.json +++ b/static/schemas/source/core/rights-constraint.json @@ -65,6 +65,7 @@ }, "channels": { "type": "array", + "maxItems": 32, "x-status": "experimental", "x-added-in": "3.3.0", "description": "Media channels where this creative may run under these rights, using the standard media channel vocabulary (the same enums/channels.json values as sync_plans). If omitted, no channel restriction. When present, only these channels are granted (an empty array grants no channel), less any also in excluded_channels (deny wins). When only excluded_channels is present, every channel except those excluded is permitted. Mirrors countries and excluded_countries. Advisory, like the other constraint fields on the wire: orchestrators and serving parties SHOULD NOT place the creative on a channel outside the effective set, and creative agents SHOULD NOT build for one (see build_creative). While approval_status is `pending` the entry grants no placement on any channel (the existing rule that a pending grant never authorizes serving); that rule applies to placement and serving, not to building, so creative agents do not raise a channel advisory for pending status alone. Verifying an attestation proves the term was granted; it does not turn this advisory check into a mandatory one in 3.3, and terms the holder needs enforced belong in `restrictions`. This is a channel-level restriction only; finer platform or placement scope (for example a single social network) is carried in ext until a platform axis is specified. When the constraint is attested, channels and excluded_channels are covered by content_digest like every other serving-relevant field.", @@ -73,6 +74,7 @@ }, "excluded_channels": { "type": "array", + "maxItems": 32, "x-status": "experimental", "x-added-in": "3.3.0", "description": "Media channels excluded under these rights (enums/channels.json values); the creative SHOULD NOT be placed there. Use when the grant is for every channel except specific ones. Wins over channels when a channel appears in both.", diff --git a/static/schemas/source/core/seller-agent-ref.json b/static/schemas/source/core/seller-agent-ref.json index ea91b4b2dcd..b6e94da2582 100644 --- a/static/schemas/source/core/seller-agent-ref.json +++ b/static/schemas/source/core/seller-agent-ref.json @@ -13,6 +13,7 @@ }, "id": { "type": "string", + "maxLength": 255, "description": "Reserved for a future registry-assigned stable seller identifier. Not used today — senders MUST NOT populate this field until a registry is defined. When a future release populates both `agent_url` and `id`, `agent_url` remains authoritative and `id` is advisory.", "pattern": "^[a-zA-Z0-9_-]+$", "minLength": 1 diff --git a/static/schemas/source/core/signal-definition-enrichment.json b/static/schemas/source/core/signal-definition-enrichment.json index 8d6c9730b92..a15c0c7276f 100644 --- a/static/schemas/source/core/signal-definition-enrichment.json +++ b/static/schemas/source/core/signal-definition-enrichment.json @@ -19,6 +19,7 @@ }, "age_determination_bases": { "type": "array", + "maxItems": 32, "x-added-in": "3.3.0", "description": "User-level bases by which the ages of this signal's members were established: verified, declared, and/or inferred. Sibling of demographic_predicate, not nested in it; only valid when demographic_predicate.age is present. Population estimates are out of scope (aggregate composition cannot establish an individual's age; use audience_evidence). Absent means the signal makes no basis claim (for a listing that projects a data_provider or signal_source definition, resolve the value from that definition; only the resolved value counts), and a buyer whose request names accepted_bases MUST NOT treat a signal with no resolved basis as satisfying the age predicate. A signal satisfies a requested age predicate with accepted_bases only when its demographic_predicate.age is within the request AND every value in age_determination_bases is in accepted_bases. The bases describe how known ages were established; unknown-age membership is governed only by include_unknown. Forward note: when gender targeting (#7925, experimental) graduates, gender will need an equivalent disclosure; this field is age-specific and the enum is not generalized. When projected from another provider, this MUST match the provider's definition exactly, the same rule demographic_predicate follows.", "items": { diff --git a/static/schemas/source/core/signal-definition.json b/static/schemas/source/core/signal-definition.json index a0e350c1b7d..0163bda6833 100644 --- a/static/schemas/source/core/signal-definition.json +++ b/static/schemas/source/core/signal-definition.json @@ -55,6 +55,7 @@ }, "age_determination_bases": { "type": "array", + "maxItems": 32, "x-added-in": "3.3.0", "description": "User-level bases by which the ages of this signal's members were established: verified, declared, and/or inferred. Sibling of demographic_predicate, not nested in it; only valid when demographic_predicate.age is present. Population estimates are out of scope (aggregate composition cannot establish an individual's age; use audience_evidence). Absent means the signal makes no basis claim (for a listing that projects a data_provider or signal_source definition, resolve the value from that definition; only the resolved value counts), and a buyer whose request names accepted_bases MUST NOT treat a signal with no resolved basis as satisfying the age predicate. A signal satisfies a requested age predicate with accepted_bases only when its demographic_predicate.age is within the request AND every value in age_determination_bases is in accepted_bases. The bases describe how known ages were established; unknown-age membership is governed only by include_unknown. Forward note: when gender targeting (#7925, experimental) graduates, gender will need an equivalent disclosure; this field is age-specific and the enum is not generalized. This definition is authoritative; listings that project it for data_provider and signal_source refs MUST match it exactly, the same rule demographic_predicate follows.", "items": { diff --git a/static/schemas/source/core/signal-listing.json b/static/schemas/source/core/signal-listing.json index 2d1ee0e7a58..150a5ff6547 100644 --- a/static/schemas/source/core/signal-listing.json +++ b/static/schemas/source/core/signal-listing.json @@ -70,6 +70,7 @@ }, "pricing_group": { "type": "string", + "maxLength": 500, "description": "Experimental (signals.pricing_groups). Optional seller-defined key naming the set of signals whose fees combine under one signal_pricing_group_rules entry when selected in the same package. The key is scoped to the listing surface (product options or the get_signals agent) it appears on. A product-scoped value overrides the get_signals value, as product-scoped pricing_options do; an option omitting it inherits. Omit when the fee is independent. Distinct from selection_group, which governs targeting composability, not fees.", "minLength": 1, "x-status": "experimental", @@ -81,6 +82,7 @@ }, "age_determination_bases": { "type": "array", + "maxItems": 32, "x-added-in": "3.3.0", "description": "User-level bases by which the ages of this signal's members were established: verified, declared, and/or inferred. Sibling of demographic_predicate, not nested in it; only valid when demographic_predicate.age is present. Population estimates are out of scope (aggregate composition cannot establish an individual's age; use audience_evidence). Absent means the signal makes no basis claim (for a listing that projects a data_provider or signal_source definition, resolve the value from that definition; only the resolved value counts), and a buyer whose request names accepted_bases MUST NOT treat a signal with no resolved basis as satisfying the age predicate. A signal satisfies a requested age predicate with accepted_bases only when its demographic_predicate.age is within the request AND every value in age_determination_bases is in accepted_bases. The bases describe how known ages were established; unknown-age membership is governed only by include_unknown. Forward note: when gender targeting (#7925, experimental) graduates, gender will need an equivalent disclosure; this field is age-specific and the enum is not generalized. For product-scoped listings this listing is authoritative; for data_provider and signal_source refs, any projected value MUST match the referenced authoritative definition, the same rule demographic_predicate follows.", "items": { diff --git a/static/schemas/source/core/signal-pricing-group-rule.json b/static/schemas/source/core/signal-pricing-group-rule.json index b124c7bd1da..834c73f2dc3 100644 --- a/static/schemas/source/core/signal-pricing-group-rule.json +++ b/static/schemas/source/core/signal-pricing-group-rule.json @@ -9,6 +9,7 @@ "properties": { "pricing_group": { "type": "string", + "maxLength": 500, "description": "The pricing_group key this rule applies to.", "minLength": 1 }, diff --git a/static/schemas/source/core/signal-targeting-rules.json b/static/schemas/source/core/signal-targeting-rules.json index 134ab332e81..9924d4dfabe 100644 --- a/static/schemas/source/core/signal-targeting-rules.json +++ b/static/schemas/source/core/signal-targeting-rules.json @@ -59,6 +59,7 @@ }, "signal_pricing_group_rules": { "type": "array", + "maxItems": 100, "description": "Experimental (signals.pricing_groups). Product-scoped rules for how fees of signals sharing a pricing_group combine; they override get_signals signal_pricing_group_rules for the same pricing_group. A group with no rule is charged 'each', so a seller opts in to 'highest' explicitly. Ungrouped signals are always 'each'.", "items": { "$ref": "/schemas/core/signal-pricing-group-rule.json" diff --git a/static/schemas/source/core/spot-reporting-capability.json b/static/schemas/source/core/spot-reporting-capability.json index 3aa4527df92..d17b47f7822 100644 --- a/static/schemas/source/core/spot-reporting-capability.json +++ b/static/schemas/source/core/spot-reporting-capability.json @@ -16,6 +16,7 @@ "available_statuses": { "x-added-in": "3.3.0", "type": "array", + "maxItems": 32, "x-status": "experimental", "description": "Spot lifecycle statuses this product reports in by_spot. Absent, or an empty array, means the seller reports only aired rows without a spot_status, the AdCP 3.2 behavior. When present, a status that is not listed is not reported: the absence of scheduled, preempted, or makegood rows then proves nothing about whether any such spots exist, and a buyer MUST NOT read it as nothing scheduled, nothing preempted, or no makegoods. 'aired' is always reported and need not be listed. Sellers MUST NOT emit this field to callers pinned below AdCP 3.3, or to callers with no declared pin.", "items": { diff --git a/static/schemas/source/core/vendor-metric-provenance.json b/static/schemas/source/core/vendor-metric-provenance.json index 1409a3a9c84..674eecf74c8 100644 --- a/static/schemas/source/core/vendor-metric-provenance.json +++ b/static/schemas/source/core/vendor-metric-provenance.json @@ -21,6 +21,7 @@ }, "mechanisms": { "type": "array", + "maxItems": 32, "description": "Mechanisms whose events enter the row's value; not every mechanism the vendor operates, and not cross-check mechanisms. `mechanisms` is the union across the row's aggregation scope. A set: order carries no meaning and values MUST NOT repeat.", "items": { "$ref": "/schemas/enums/collection-mechanism.json" }, "minItems": 1, diff --git a/static/schemas/source/core/wholesale-feed-event.json b/static/schemas/source/core/wholesale-feed-event.json index eddcef02a3d..b7a786290a5 100644 --- a/static/schemas/source/core/wholesale-feed-event.json +++ b/static/schemas/source/core/wholesale-feed-event.json @@ -537,6 +537,7 @@ }, "collection_id": { "type": "string", + "maxLength": 255, "x-entity": "collection" }, "removal_reason": { diff --git a/static/schemas/source/creative/creative-staged-update-changed-webhook.json b/static/schemas/source/creative/creative-staged-update-changed-webhook.json index 4e5eac108d8..9aebab3b012 100644 --- a/static/schemas/source/creative/creative-staged-update-changed-webhook.json +++ b/static/schemas/source/creative/creative-staged-update-changed-webhook.json @@ -40,11 +40,13 @@ }, "account_id": { "type": "string", + "maxLength": 255, "description": "Seller's identifier for the account this creative belongs to.", "x-entity": "account" }, "creative_id": { "type": "string", + "maxLength": 255, "description": "Seller's identifier for the creative whose staged update was decided. References the same id space as `list_creatives` / `sync_creatives` responses.", "x-entity": "creative" }, diff --git a/static/schemas/source/creative/list-creatives-response.json b/static/schemas/source/creative/list-creatives-response.json index b03b77c48a5..22d0545f722 100644 --- a/static/schemas/source/creative/list-creatives-response.json +++ b/static/schemas/source/creative/list-creatives-response.json @@ -66,6 +66,7 @@ }, "platform_id": { "type": "string", + "maxLength": 255, "description": "The seller's identifier for this creative in its source of truth. Same meaning as platform_id in the sync_creatives response, readable after that response is gone. May equal creative_id for seller-assigned creatives.", "$comment": "x-entity deliberately omitted: seller-opaque identifier in the seller's own namespace; buyers echo creative_id, never platform_id, on AdCP requests.", "x-added-in": "3.3.0" @@ -306,6 +307,7 @@ }, "trackers": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/core/assignment-tracker.json" }, "description": "The complete assignment-scoped tracker list for this creative on this package, retaining the accepted URL templates, events, multiplicity, and order. Sellers supporting creative.supports_assignment_trackers MUST return this array, using [] when no assignment trackers exist. Excludes the creative's own trackers, which remain in its assets and also fire for this placement; this is not a combined effective tracker list.", "x-added-in": "3.3.0" diff --git a/static/schemas/source/creative/sync-creatives-request.json b/static/schemas/source/creative/sync-creatives-request.json index 63821c78771..040a152f007 100644 --- a/static/schemas/source/creative/sync-creatives-request.json +++ b/static/schemas/source/creative/sync-creatives-request.json @@ -273,6 +273,7 @@ "package_id": { "type": "string", "minLength": 1, "x-entity": "package" }, "trackers": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/core/assignment-tracker.json" }, "minItems": 1, "description": "Additional measurement trackers for this creative on this package only, fired alongside the creative's own trackers without changing the library creative, its revision, or its approval. Requires creative.supports_assignment_trackers: true; buyers MUST NOT send this field otherwise and unsupported agents MUST reject it with UNSUPPORTED_FEATURE. The seller MUST fire every accepted tracker at its declared event or reject the assignment through existing assignment errors; trackers MUST NOT be silently dropped. Creative and assignment trackers together count against the effective format's tracker-slot limits, including canonical params.slots[].max and legacy repeatable-group max_count. Each assignment tracker consumes one compatible tracker-slot occurrence without moving creative assets (impression_tracker takes impression, click_tracker takes click, viewability_tracker takes viewable_* and audible_video_complete, any other pixel_tracker slot takes any event); reject if no allocation satisfies each slot's event and count constraints. These limits apply only when the effective format declares at least one tracker slot: a format that declares none makes no slot-limit claim, and the seller still fires every accepted tracker or rejects the assignment. Each accepted occurrence fires once per logical event; identical URLs are not deduplicated. A supplied list replaces the prior assignment tracker list. Omission on an additive upsert preserves existing assignment trackers. To clear them, atomically unassign then assign without this field, retaining any other authored assignment settings. Empty arrays and null are not accepted.", @@ -359,7 +360,7 @@ "operation": { "const": "merge" }, "creative_id": { "type": "string", "minLength": 1, "description": "Buyer's creative that takes over the assignment. It need not already be assigned to package_id.", "x-entity": "creative" }, "package_id": { "type": "string", "minLength": 1, "x-entity": "package" }, - "merged_creative_id": { "type": "string", "minLength": 1, "description": "Seller-created creative (one that entered the library outside sync_creatives, under a seller-assigned creative_id) currently assigned to package_id that the seller verifies is the same creative as creative_id.", "x-entity": "creative" } + "merged_creative_id": { "type": "string", "maxLength": 255, "minLength": 1, "description": "Seller-created creative (one that entered the library outside sync_creatives, under a seller-assigned creative_id) currently assigned to package_id that the seller verifies is the same creative as creative_id.", "x-entity": "creative" } }, "required": ["operation", "creative_id", "package_id", "merged_creative_id"], "additionalProperties": false, diff --git a/static/schemas/source/creative/sync-creatives-response.json b/static/schemas/source/creative/sync-creatives-response.json index c7a5027be80..237ee753d31 100644 --- a/static/schemas/source/creative/sync-creatives-response.json +++ b/static/schemas/source/creative/sync-creatives-response.json @@ -196,6 +196,7 @@ }, "merges": { "type": "array", + "maxItems": 100, "x-added-in": "3.3.0", "description": "One entry per merge assignment operation the seller applied, in request order (under dry_run, one per merge that would be applied). Present exactly when the request contained merge operations and succeeded. A merge that fails verification fails the whole request with CREATIVE_MERGE_REJECTED, whose details list every rejected merge and its reason; a merge awaiting a person's confirmation is reported on the submitted task's completion artifact, never as a partial result here.", "items": { @@ -203,17 +204,20 @@ "properties": { "creative_id": { "type": "string", + "maxLength": 255, "minLength": 1, "description": "Buyer's creative that now holds the assignment.", "x-entity": "creative" }, "package_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-entity": "package" }, "merged_creative_id": { "type": "string", + "maxLength": 255, "minLength": 1, "description": "Seller-assigned creative whose assignment on package_id was merged into creative_id.", "x-entity": "creative" diff --git a/static/schemas/source/creative/validate-input-result.json b/static/schemas/source/creative/validate-input-result.json index 309fb8059c4..04a925bdc76 100644 --- a/static/schemas/source/creative/validate-input-result.json +++ b/static/schemas/source/creative/validate-input-result.json @@ -79,6 +79,7 @@ "rule": { "type": "string" }, "field": { "type": "string", + "maxLength": 500, "description": "Path to the field the warning concerns, in the same form as `violations[].field` (e.g., 'assets.video_main.duration_ms').", "x-added-in": "3.3.0" }, diff --git a/static/schemas/source/error-details/budget-too-low.json b/static/schemas/source/error-details/budget-too-low.json index 1412e63b24e..47f181b52dd 100644 --- a/static/schemas/source/error-details/budget-too-low.json +++ b/static/schemas/source/error-details/budget-too-low.json @@ -15,6 +15,7 @@ }, "budget_field": { "type": "string", + "maxLength": 500, "minLength": 1, "description": "JSONPath-lite locator for the constrained budget in the request's target scope, separate from error.field and issues[].pointer, whose existing semantics are unchanged. May name a retained budget omitted from an update. packages[i] always indexes a submitted request row, resolved through its package_id on updates, never a readback array index. Omit if the affected package has no submitted row or the budget cannot otherwise be located unambiguously; do not fabricate an index. Buyers must read and reconcile a retained budget before changing it.", "x-added-in": "3.3.0" @@ -27,6 +28,7 @@ }, "constraint": { "type": "string", + "maxLength": 500, "minLength": 1, "examples": ["product_minimum", "effective_bid_floor"], "description": "Cause of the budget floor, separate from its period. product_minimum identifies a seller's minimum for the selected product/pricing option; effective_bid_floor identifies a minimum computed from the effective bidding policy. Other non-empty values are permitted; buyers that do not recognize one can still use the amount, currency, period, and an unambiguous budget locator for recovery.", @@ -34,6 +36,7 @@ }, "related_field": { "type": "string", + "maxLength": 500, "minLength": 1, "description": "Request field path for an input contributing to the floor, using the same JSONPath-lite convention as error.field. For effective_bid_floor this identifies a buyer-authored bid that contributes to the computed minimum; budget_field separately identifies the constrained budget. Omit when no contributing request field can be identified; do not invent a path to a seller default.", "x-added-in": "3.3.0" diff --git a/static/schemas/source/error-details/creative-live-update-unsupported.json b/static/schemas/source/error-details/creative-live-update-unsupported.json index 624541c8146..063c7375aa4 100644 --- a/static/schemas/source/error-details/creative-live-update-unsupported.json +++ b/static/schemas/source/error-details/creative-live-update-unsupported.json @@ -7,6 +7,7 @@ "properties": { "refused_changes": { "type": "array", + "maxItems": 32, "items": { "$ref": "/schemas/enums/creative-change-kind.json" }, "minItems": 1, "uniqueItems": true, @@ -14,7 +15,8 @@ }, "live_package_ids": { "type": "array", - "items": { "type": "string", "minLength": 1, "x-entity": "package" }, + "maxItems": 1000, + "items": { "type": "string", "maxLength": 255, "minLength": 1, "x-entity": "package" }, "uniqueItems": true, "description": "Packages in the caller's account on which the creative is live. These are the packages on which to replace it." } diff --git a/static/schemas/source/error-details/creative-merge-rejected.json b/static/schemas/source/error-details/creative-merge-rejected.json index 7c2b1db0054..e4a92758f52 100644 --- a/static/schemas/source/error-details/creative-merge-rejected.json +++ b/static/schemas/source/error-details/creative-merge-rejected.json @@ -7,6 +7,7 @@ "properties": { "rejections": { "type": "array", + "maxItems": 100, "minItems": 1, "items": { "type": "object", @@ -18,16 +19,19 @@ }, "creative_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-entity": "creative" }, "package_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-entity": "package" }, "merged_creative_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-entity": "creative" }, diff --git a/static/schemas/source/error-details/unsupported-targeting-dimension.json b/static/schemas/source/error-details/unsupported-targeting-dimension.json index 96e40d65d79..493e3ac97c1 100644 --- a/static/schemas/source/error-details/unsupported-targeting-dimension.json +++ b/static/schemas/source/error-details/unsupported-targeting-dimension.json @@ -8,13 +8,15 @@ "properties": { "unsupported_dimension": { "type": "string", + "maxLength": 500, "minLength": 1, "description": "The targeting field name that was rejected, for example `geo_countries`. Names the dimension, not an individual value; value-level problems inside a supported dimension follow that dimension's own rules." }, "supported_dimensions": { "type": "array", + "maxItems": 32, "description": "Targeting dimensions the caller could already read from `get_adcp_capabilities` or the product's `overlay_support`. Sellers MAY omit it; absence means consult those surfaces, not that any dimension is supported.", - "items": { "type": "string", "minLength": 1 }, + "items": { "type": "string", "maxLength": 500, "minLength": 1 }, "uniqueItems": true }, "deprecated": { @@ -23,11 +25,13 @@ }, "replacement_dimension": { "type": "string", + "maxLength": 500, "minLength": 1, "description": "Targeting dimension that replaces the rejected one. Typically set with `deprecated: true`." }, "product_id": { "type": "string", + "maxLength": 255, "minLength": 1, "description": "Product the dimension was rejected for, when support is product-scoped.", "x-entity": "product" diff --git a/static/schemas/source/governance/check-governance-request.json b/static/schemas/source/governance/check-governance-request.json index eb2a52feb44..30412a74c5e 100644 --- a/static/schemas/source/governance/check-governance-request.json +++ b/static/schemas/source/governance/check-governance-request.json @@ -230,6 +230,7 @@ "properties": { "plan_id": { "type": "string", + "maxLength": 255, "description": "Campaign governance plan identifier. Required on the initial intent or availability check, before a governance_context exists. Optional on subsequent checks: the governance agent derives the plan from its own signed governance_context. If both are present, the governance agent MUST reject the request when plan_id does not match the token's plan binding. Services MUST treat governance_context as authoritative and MUST NOT require a buyer to disclose plan_id. A plan is owned by the authenticated buyer principal that synchronized it; plan_id is an identifier, not an account credential.", "x-entity": "governance_plan" }, @@ -279,6 +280,7 @@ }, "tool": { "type": "string", + "maxLength": 500, "description": "The AdCP tool being checked (e.g., 'create_media_buy', 'acquire_rights', 'activate_signal'). Present on intent checks (orchestrator). The governance agent uses the presence of tool+payload to identify an intent check." }, "payload": { @@ -426,6 +428,7 @@ }, "baseline_description": { "type": "string", + "maxLength": 2000, "description": "Description of the baseline when baseline is 'custom' (e.g., 'US adults 18+ with broadband access')." }, "indices": { diff --git a/static/schemas/source/governance/check-governance-response.json b/static/schemas/source/governance/check-governance-response.json index 495d1a0442e..a3d3dcf2396 100644 --- a/static/schemas/source/governance/check-governance-response.json +++ b/static/schemas/source/governance/check-governance-response.json @@ -112,6 +112,7 @@ "properties": { "check_id": { "type": "string", + "maxLength": 255, "description": "Unique identifier for this governance check record. Use in report_plan_outcome to link outcomes to the check that authorized them.", "x-entity": "governance_check" }, @@ -126,6 +127,7 @@ }, "plan_id": { "type": "string", + "maxLength": 255, "description": "Plan identifier echoed on an initial plan-addressed check. Optional on continuation checks addressed by governance_context; services do not need this value and MUST treat the token binding as authoritative.", "x-entity": "governance_plan" }, @@ -140,25 +142,30 @@ }, "explanation": { "type": "string", + "maxLength": 2000, "description": "Human-readable explanation of the governance decision." }, "findings": { "type": "array", + "maxItems": 100, "description": "Specific issues found during the governance check. Present when verdict is 'denied' or 'conditions'. MAY also be present on 'approved' for informational findings (e.g., budget approaching limit).", "items": { "type": "object", "properties": { "category_id": { "type": "string", + "maxLength": 255, "description": "Validation category that flagged the issue (e.g., 'budget_compliance', 'regulatory_compliance', 'brand_safety'). This is an **agent-internal** taxonomy: the string is defined by the governance agent's own policy model and is not constrained to any protocol-level enum. Sellers and buyers MUST NOT pattern-match `category_id` values against a fixed list — treat them as opaque labels with human-readable significance for audit but no machine-level contract. See the Campaign Governance specification for how an agent composes internal specialist review behind one endpoint." }, "policy_id": { "type": "string", + "maxLength": 255, "description": "ID of the policy that triggered this finding. May reference a registry policy (with source: registry) or a bespoke inline policy (with source: inline). Bespoke policy_ids are unique within their authoring container; use source_plan_id when findings aggregate across multiple plans (e.g., portfolio evaluations). When the violation traces to a producer-tagged surface (feature-requirement, creative-feature-result, or validation-result feature) carrying policy_id, governance agents SHOULD echo that policy_id here for end-to-end traceability, and MUST NOT invent a policy_id that wasn't present on the originating surface. See /docs/governance/policy-attribution.", "$comment": "x-entity deliberately omitted — a finding's policy_id can reference EITHER a governance_registry_policy or a governance_inline_policy depending on which policy matched. Resolution requires a sibling source discriminator the lint can't see from this leaf. Storyboards that capture from findings must re-annotate at the consume site (see #2685 for the registry/inline split)." }, "source_plan_id": { "type": "string", + "maxLength": 255, "description": "For portfolio or aggregated evaluations where findings draw on bespoke policies from multiple member plans: identifies the plan whose policy triggered this finding. Omit when the finding's policy_id is unambiguous within the response context (e.g., single-plan check_governance).", "x-entity": "governance_plan" }, @@ -167,6 +174,7 @@ }, "explanation": { "type": "string", + "maxLength": 2000, "description": "Human-readable description of the issue." }, "details": { @@ -182,6 +190,7 @@ }, "uncertainty_reason": { "type": "string", + "maxLength": 2000, "description": "Explanation of why confidence is below 1.0 (e.g., 'Targeting includes regions that partially overlap jurisdiction boundaries'). Present when confidence is below a governance-agent-defined threshold." }, "attestation_reference_digest": { @@ -200,12 +209,14 @@ }, "conditions": { "type": "array", + "maxItems": 100, "description": "Intent-phase counterproposal. Present only when verdict is 'conditions'. It does not authorize execution and MUST NOT be returned for execution or lifecycle checks. Each field path is rooted at the complete check_governance request arguments, so both payload.* and proposed_commitment.* can be addressed. After applying conditions, the caller MUST re-call check_governance with the adjusted parameters and receive approved before proceeding.", "items": { "type": "object", "properties": { "field": { "type": "string", + "maxLength": 500, "description": "Dot-path rooted at the complete check_governance request arguments (for example payload.total_budget.amount or proposed_commitment.amount). Conditions are not valid for committed execution checks." }, "required_value": { @@ -213,6 +224,7 @@ }, "reason": { "type": "string", + "maxLength": 2000, "description": "Why this condition is required." } }, @@ -244,11 +256,11 @@ "type": "object", "description": "Canonical seller-attributed delivery statement retained by governance. Present on delivery execution checks. The buyer binds any later observation to this exact statement through report_plan_outcome.", "properties": { - "statement_id": { "type": "string", "x-entity": "governance_delivery_statement" }, + "statement_id": { "type": "string", "maxLength": 255, "x-entity": "governance_delivery_statement" }, "statement_digest": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" }, "sequence": { "type": "integer", "minimum": 1 }, "issued_at": { "type": "string", "format": "date-time" }, - "seller_reference": { "type": "string" }, + "seller_reference": { "type": "string", "maxLength": 255 }, "reporting_period": { "type": "object", "properties": { @@ -264,7 +276,7 @@ "type": "object", "description": "Exact retained digest-bearing payload. To verify statement_digest, apply RFC 8785 JCS after removing delivery_metrics.statement_digest.", "properties": { - "seller_reference": { "type": "string" }, + "seller_reference": { "type": "string", "maxLength": 255 }, "delivery_metrics": { "type": "object", "additionalProperties": true } }, "required": ["seller_reference", "delivery_metrics"], @@ -276,15 +288,19 @@ }, "categories_evaluated": { "type": "array", + "maxItems": 100, "items": { - "type": "string" + "type": "string", + "maxLength": 500 }, "description": "Governance categories evaluated during this check. Each value is an **agent-internal** label (e.g., `budget_authority`, `regulatory_compliance`, or any internal-reviewer key the agent's policy model defines) — not a protocol-level enum. Since one governance agent per account composes all specialist review behind its single endpoint, `categories_evaluated` is how that internal decomposition surfaces to auditors. Consumers MUST treat values as opaque labels for display and audit, not as a machine-level contract." }, "policies_evaluated": { "type": "array", + "maxItems": 100, "items": { - "type": "string" + "type": "string", + "maxLength": 2000 }, "description": "Policy IDs evaluated during this check. Includes registry policy IDs (resolved via the policy registry) and any inline `policy_id`s declared in the plan's `custom_policies`." }, diff --git a/static/schemas/source/governance/get-plan-audit-logs-request.json b/static/schemas/source/governance/get-plan-audit-logs-request.json index 7de0c43ded7..14276b76629 100644 --- a/static/schemas/source/governance/get-plan-audit-logs-request.json +++ b/static/schemas/source/governance/get-plan-audit-logs-request.json @@ -13,8 +13,10 @@ "properties": { "plan_ids": { "type": "array", + "maxItems": 100, "items": { "type": "string", + "maxLength": 255, "x-entity": "governance_plan" }, "minItems": 1, @@ -22,8 +24,10 @@ }, "portfolio_plan_ids": { "type": "array", + "maxItems": 100, "items": { "type": "string", + "maxLength": 255, "x-entity": "governance_plan" }, "minItems": 1, @@ -31,14 +35,17 @@ }, "governance_contexts": { "type": "array", + "maxItems": 100, "items": { - "type": "string" + "type": "string", + "maxLength": 4096 }, "minItems": 1, "description": "Filter audit entries by governance context. Returns only checks and outcomes that share these governance contexts, enabling lifecycle tracing across purchase types." }, "purchase_types": { "type": "array", + "maxItems": 32, "items": { "$ref": "/schemas/enums/purchase-type.json" }, diff --git a/static/schemas/source/governance/get-plan-audit-logs-response.json b/static/schemas/source/governance/get-plan-audit-logs-response.json index 39cfb7c9e50..2e5e6831213 100644 --- a/static/schemas/source/governance/get-plan-audit-logs-response.json +++ b/static/schemas/source/governance/get-plan-audit-logs-response.json @@ -13,12 +13,14 @@ "properties": { "plans": { "type": "array", + "maxItems": 100, "description": "Audit data for each requested plan.", "items": { "type": "object", "properties": { "plan_id": { "type": "string", + "maxLength": 255, "description": "Plan identifier.", "x-entity": "governance_plan" }, @@ -154,21 +156,25 @@ }, "escalations": { "type": "array", + "maxItems": 100, "description": "All escalations and their resolutions.", "items": { "type": "object", "properties": { "check_id": { "type": "string", + "maxLength": 255, "description": "The escalated governance check.", "x-entity": "governance_check" }, "reason": { "type": "string", + "maxLength": 2000, "description": "Why it was escalated." }, "resolution": { "type": "string", + "maxLength": 500, "description": "How it was resolved (e.g., 'approved_by_human', 'rejected_by_human')." }, "resolved_at": { @@ -260,12 +266,14 @@ }, "entries": { "type": "array", + "maxItems": 10000, "description": "Ordered audit trail. Only present when include_entries is true.", "items": { "type": "object", "properties": { "id": { "type": "string", + "maxLength": 255, "description": "Entry identifier." }, "type": { @@ -284,6 +292,7 @@ }, "plan_id": { "type": "string", + "maxLength": 255, "description": "Plan this entry belongs to. Present when querying multiple plans or a portfolio.", "x-entity": "governance_plan" }, @@ -294,6 +303,7 @@ }, "tool": { "type": "string", + "maxLength": 500, "description": "The AdCP tool (present for check entries)." }, "verdict": { @@ -314,37 +324,46 @@ }, "explanation": { "type": "string", + "maxLength": 2000, "description": "Human-readable explanation of the governance decision (present for check entries)." }, "policies_evaluated": { "type": "array", + "maxItems": 100, "items": { - "type": "string" + "type": "string", + "maxLength": 2000 }, "description": "Policy IDs evaluated during this check. Includes registry policy IDs (resolved via the policy registry) and any inline `policy_id`s declared in the plan's `custom_policies`. Present for check entries." }, "categories_evaluated": { "type": "array", + "maxItems": 100, "items": { - "type": "string" + "type": "string", + "maxLength": 500 }, "description": "Governance categories evaluated (e.g., 'budget_authority', 'regulatory_compliance'). Present for check entries." }, "findings": { "type": "array", + "maxItems": 100, "description": "Findings from this check or outcome. Same structure as check_governance response findings.", "items": { "type": "object", "properties": { "category_id": { - "type": "string" + "type": "string", + "maxLength": 255 }, "policy_id": { "type": "string", + "maxLength": 255, "$comment": "x-entity deliberately omitted — audit log findings mirror check_governance findings and can reference either a governance_registry_policy or a governance_inline_policy (see #2685)." }, "source_plan_id": { "type": "string", + "maxLength": 255, "description": "Plan whose policy triggered this finding when the audit entry aggregates findings across plans.", "x-entity": "governance_plan" }, @@ -352,7 +371,8 @@ "$ref": "/schemas/enums/escalation-severity.json" }, "explanation": { - "type": "string" + "type": "string", + "maxLength": 2000 }, "details": { "type": "object", @@ -366,6 +386,7 @@ }, "uncertainty_reason": { "type": "string", + "maxLength": 2000, "description": "Reason the finding carries less than full confidence, retained exactly as emitted by check_governance." }, "attestation_reference_digest": { @@ -386,11 +407,11 @@ "type": "object", "description": "Canonical seller statement retained on a delivery check entry.", "properties": { - "statement_id": { "type": "string", "x-entity": "governance_delivery_statement" }, + "statement_id": { "type": "string", "maxLength": 255, "x-entity": "governance_delivery_statement" }, "statement_digest": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" }, "sequence": { "type": "integer", "minimum": 1 }, "issued_at": { "type": "string", "format": "date-time" }, - "seller_reference": { "type": "string" }, + "seller_reference": { "type": "string", "maxLength": 255 }, "cumulative_spend": { "type": "number", "minimum": 0 }, "currency": { "type": "string", "pattern": "^[A-Z]{3}$" }, "reporting_period": { @@ -406,7 +427,7 @@ "type": "object", "description": "Exact retained payload used to verify statement_digest after removing delivery_metrics.statement_digest.", "properties": { - "seller_reference": { "type": "string" }, + "seller_reference": { "type": "string", "maxLength": 255 }, "delivery_metrics": { "type": "object", "additionalProperties": true } }, "required": ["seller_reference", "delivery_metrics"], @@ -426,11 +447,13 @@ }, "outcome_id": { "type": "string", + "maxLength": 255, "description": "Source completed outcome (present for adjustment entries).", "x-entity": "governance_outcome" }, "seller_adjustment_id": { "type": "string", + "maxLength": 255, "description": "Seller-issued source adjustment identifier (present for adjustment entries).", "x-entity": "seller_adjustment" }, @@ -470,6 +493,7 @@ }, "reason": { "type": "string", + "maxLength": 2000, "description": "Seller-supplied adjustment reason." }, "effective_at": { @@ -488,6 +512,7 @@ }, "seller_reference": { "type": "string", + "maxLength": 255, "description": "Seller resource identifier retained on an outcome entry." }, "delivery": { @@ -515,6 +540,7 @@ }, "seller_statement_id": { "type": "string", + "maxLength": 255, "description": "Seller statement identifier as received by the buyer. Required for seller_statement_copy.", "x-entity": "governance_delivery_statement" }, @@ -562,6 +588,7 @@ }, "governance_context": { "type": "string", + "maxLength": 4096, "description": "Governance context for this entry (present for check and outcome entries)." }, "plan_hash": { @@ -599,6 +626,7 @@ }, "outcome_status": { "type": "string", + "maxLength": 500, "description": "Outcome status (present for outcome entries)." }, "delivery_reconciliation_status": { @@ -618,7 +646,7 @@ "evidence": { "type": "object", "properties": { - "evidence_id": { "type": "string", "x-entity": "governance_adjustment_evidence" }, + "evidence_id": { "type": "string", "maxLength": 255, "x-entity": "governance_adjustment_evidence" }, "evidence_type": { "type": "string", "enum": ["decommitment_agreement", "refund_settlement", "credit_note", "makegood_agreement"] }, "digest": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" }, "issued_at": { "type": "string", "format": "date-time" } @@ -628,7 +656,7 @@ }, "reviewed_by": { "type": "string", "format": "uri" }, "reviewed_at": { "type": "string", "format": "date-time" }, - "review_reason": { "type": "string" } + "review_reason": { "type": "string", "maxLength": 2000 } }, "required": [ "id", @@ -650,12 +678,14 @@ }, "governed_actions": { "type": "array", + "maxItems": 100, "description": "Per-action breakdown joined by the governance agent's stable opaque action binding. governance_context is the original intent context exposed for correlation; lifecycle tokens may differ because each approval is freshly signed.", "items": { "type": "object", "properties": { "governance_context": { "type": "string", + "maxLength": 4096, "description": "Governance context correlating this action's lifecycle." }, "purchase_type": { @@ -727,6 +757,7 @@ }, "seller_reference": { "type": "string", + "maxLength": 255, "description": "The seller's identifier for the resource (e.g., media_buy_id, rights_grant_id). Present when reported via report_plan_outcome." } }, diff --git a/static/schemas/source/governance/report-plan-adjustment-request.json b/static/schemas/source/governance/report-plan-adjustment-request.json index f3b208786bb..89d815a0c9c 100644 --- a/static/schemas/source/governance/report-plan-adjustment-request.json +++ b/static/schemas/source/governance/report-plan-adjustment-request.json @@ -50,18 +50,21 @@ }, "plan_id": { "type": "string", + "maxLength": 255, "minLength": 1, "description": "Plan containing the source outcome.", "x-entity": "governance_plan" }, "outcome_id": { "type": "string", + "maxLength": 255, "minLength": 1, "description": "Completed outcome whose authoritative commitment is being adjusted.", "x-entity": "governance_outcome" }, "adjustment_id": { "type": "string", + "maxLength": 255, "description": "Adjustment to accept or dispute. Required for review.", "x-entity": "governance_adjustment" }, diff --git a/static/schemas/source/governance/report-plan-adjustment-response.json b/static/schemas/source/governance/report-plan-adjustment-response.json index 620bfb28848..1b9a24bbd51 100644 --- a/static/schemas/source/governance/report-plan-adjustment-response.json +++ b/static/schemas/source/governance/report-plan-adjustment-response.json @@ -9,6 +9,7 @@ "properties": { "adjustment_id": { "type": "string", + "maxLength": 255, "description": "Governance-agent identifier for the adjustment record.", "x-entity": "governance_adjustment" }, diff --git a/static/schemas/source/governance/report-plan-outcome-request.json b/static/schemas/source/governance/report-plan-outcome-request.json index 15c8c9559e2..935f8f5dafe 100644 --- a/static/schemas/source/governance/report-plan-outcome-request.json +++ b/static/schemas/source/governance/report-plan-outcome-request.json @@ -37,11 +37,13 @@ "properties": { "plan_id": { "type": "string", + "maxLength": 255, "description": "The plan this outcome is for. The plan is owned by the authenticated buyer that synchronized it; plan_id is an identifier, not an account credential. Completed and failed settlements inherit their commercial binding from the exact approved check tuple.", "x-entity": "governance_plan" }, "check_id": { "type": "string", + "maxLength": 255, "description": "The check_id from check_governance. Required for completed and failed outcomes and for buyer delivery observations. A delivery observation names the exact seller delivery check whose canonical statement is being compared.", "x-entity": "governance_check" }, @@ -77,6 +79,7 @@ }, "packages": { "type": "array", + "maxItems": 100, "description": "Confirmed packages with actual budget and targeting.", "items": { "type": "object", @@ -126,6 +129,7 @@ }, "seller_statement_id": { "type": "string", + "maxLength": 255, "description": "Seller statement identifier as received by the buyer. Required for seller_statement_copy.", "x-entity": "governance_delivery_statement" }, diff --git a/static/schemas/source/governance/report-plan-outcome-response.json b/static/schemas/source/governance/report-plan-outcome-response.json index a36148df4e3..b7ce378d847 100644 --- a/static/schemas/source/governance/report-plan-outcome-response.json +++ b/static/schemas/source/governance/report-plan-outcome-response.json @@ -13,6 +13,7 @@ "properties": { "outcome_id": { "type": "string", + "maxLength": 255, "description": "Unique identifier for this outcome record.", "x-entity": "governance_outcome" }, @@ -46,12 +47,14 @@ }, "findings": { "type": "array", + "maxItems": 100, "description": "Issues detected. Present only when outcome_state is 'findings'.", "items": { "type": "object", "properties": { "category_id": { "type": "string", + "maxLength": 255, "description": "Which validation category flagged the issue." }, "severity": { @@ -60,6 +63,7 @@ }, "explanation": { "type": "string", + "maxLength": 2000, "description": "Human-readable description of the issue." }, "details": { diff --git a/static/schemas/source/governance/sync-plans-request.json b/static/schemas/source/governance/sync-plans-request.json index 4a9bfa744b0..16f16141fc6 100644 --- a/static/schemas/source/governance/sync-plans-request.json +++ b/static/schemas/source/governance/sync-plans-request.json @@ -21,12 +21,14 @@ }, "plans": { "type": "array", + "maxItems": 100, "description": "One or more campaign plans to sync.", "items": { "type": "object", "properties": { "plan_id": { "type": "string", + "maxLength": 255, "description": "Unique identifier for this plan.", "x-entity": "governance_plan" }, @@ -49,6 +51,7 @@ }, "currency": { "type": "string", + "maxLength": 64, "description": "ISO 4217 currency code." }, "accounting_mode": { @@ -179,6 +182,7 @@ "properties": { "required": { "type": "array", + "maxItems": 32, "items": { "$ref": "/schemas/enums/channels.json" }, @@ -186,6 +190,7 @@ }, "allowed": { "type": "array", + "maxItems": 32, "items": { "$ref": "/schemas/enums/channels.json" }, @@ -233,33 +238,41 @@ }, "countries": { "type": "array", + "maxItems": 256, "items": { - "type": "string" + "type": "string", + "maxLength": 64 }, "minItems": 1, "description": "ISO 3166-1 alpha-2 country codes for authorized markets (e.g., ['US', 'GB']). The governance agent rejects governed actions targeting outside these countries and resolves applicable policies by matching against policy jurisdictions." }, "regions": { "type": "array", + "maxItems": 1000, "items": { - "type": "string" + "type": "string", + "maxLength": 64 }, "minItems": 1, "description": "ISO 3166-2 subdivision codes for authorized sub-national markets (e.g., ['US-MA', 'US-CA']). When present, the governance agent restricts governed actions to these specific regions rather than the full country. Use for plans limited to specific states or provinces (e.g., cannabis in legal states). Policy resolution matches against both the subdivision and its parent country." }, "policy_ids": { "type": "array", + "maxItems": 100, "items": { "type": "string", + "maxLength": 255, "x-entity": "governance_registry_policy" }, "description": "Registry policy IDs to enforce for this plan. The governance agent resolves full policy definitions from the registry and evaluates actions against them. Intersected with the plan's countries/regions to activate only geographically relevant policies." }, "policy_categories": { "type": "array", + "maxItems": 32, "description": "Regulatory categories that apply to this campaign. Determines which policy regimes the governance agent enforces (e.g., 'children_directed' activates COPPA/AADC, 'political_advertising' activates disclosure requirements). The governance agent resolves categories to specific policies based on the plan's jurisdictions. When omitted, governance agents MAY infer categories from the brand's industries and the plan's objectives. Values are registry-defined category IDs (intentionally freeform strings, not an enum — new categories are added as regulations evolve).", "items": { - "type": "string" + "type": "string", + "maxLength": 500 }, "minItems": 1 }, @@ -269,6 +282,7 @@ }, "restricted_attributes": { "type": "array", + "maxItems": 32, "description": "Personal data categories that must not be used for targeting in this campaign. Applies horizontally across all audience criteria. Used for EU DSA Article 26 compliance (prohibits targeting on GDPR Article 9 special categories) and similar regulations. The governance agent flags any audience targeting that references these attributes.", "items": { "$ref": "/schemas/enums/restricted-attribute.json" @@ -277,9 +291,11 @@ }, "restricted_attributes_custom": { "type": "array", + "maxItems": 100, "description": "Additional restricted attributes not covered by the restricted-attribute enum. Freeform strings for jurisdiction-specific or brand-specific restrictions beyond GDPR Article 9 categories (e.g., 'financial_status', 'immigration_status'). Governance agents use semantic matching for these.", "items": { - "type": "string" + "type": "string", + "maxLength": 500 }, "minItems": 1 }, @@ -295,6 +311,7 @@ }, "custom_policies": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/governance/policy-entry.json" }, @@ -305,6 +322,7 @@ "array", "null" ], + "maxItems": 100, "items": { "type": "string", "format": "uri" @@ -313,6 +331,7 @@ }, "delegations": { "type": "array", + "maxItems": 100, "description": "Agents authorized to execute against this plan. Each delegation scopes an agent's authority by budget, markets, and expiration. The governance agent validates that the requesting agent matches a delegation before approving actions.", "items": { "type": "object", @@ -334,7 +353,8 @@ "type": "number" }, "currency": { - "type": "string" + "type": "string", + "maxLength": 64 } }, "required": [ @@ -345,8 +365,10 @@ }, "markets": { "type": "array", + "maxItems": 100, "items": { - "type": "string" + "type": "string", + "maxLength": 500 }, "description": "ISO 3166-1/3166-2 codes this agent is authorized for. When omitted, the agent can operate in all plan markets." }, @@ -369,8 +391,10 @@ "properties": { "member_plan_ids": { "type": "array", + "maxItems": 100, "items": { "type": "string", + "maxLength": 255, "x-entity": "governance_plan" }, "description": "Plan IDs governed by this portfolio plan. The governance agent validates member plan actions against portfolio constraints." @@ -383,7 +407,8 @@ "type": "number" }, "currency": { - "type": "string" + "type": "string", + "maxLength": 64 } }, "required": [ @@ -394,14 +419,17 @@ }, "shared_policy_ids": { "type": "array", + "maxItems": 100, "items": { "type": "string", + "maxLength": 255, "x-entity": "governance_registry_policy" }, "description": "Registry policy IDs enforced across all member plans, regardless of individual brand configuration." }, "shared_exclusions": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/governance/policy-entry.json" }, @@ -430,6 +458,7 @@ "properties": { "policy_categories": { "type": "array", + "maxItems": 32, "contains": { "enum": [ "fair_housing", @@ -460,6 +489,7 @@ "properties": { "policy_ids": { "type": "array", + "maxItems": 100, "contains": { "const": "eu_ai_act_annex_iii" } diff --git a/static/schemas/source/governance/sync-plans-response.json b/static/schemas/source/governance/sync-plans-response.json index b2c77f3f1a3..176f403685a 100644 --- a/static/schemas/source/governance/sync-plans-response.json +++ b/static/schemas/source/governance/sync-plans-response.json @@ -13,12 +13,14 @@ "properties": { "plans": { "type": "array", + "maxItems": 100, "description": "Status for each synced plan.", "items": { "type": "object", "properties": { "plan_id": { "type": "string", + "maxLength": 255, "description": "Plan identifier.", "x-entity": "governance_plan" }, @@ -36,12 +38,14 @@ }, "categories": { "type": "array", + "maxItems": 32, "description": "Validation categories active for this plan.", "items": { "type": "object", "properties": { "category_id": { "type": "string", + "maxLength": 255, "description": "Validation category identifier." }, "status": { @@ -62,12 +66,14 @@ }, "resolved_policies": { "type": "array", + "maxItems": 100, "description": "Policies the governance agent will enforce for this plan. Includes explicitly referenced policies from the brand compliance configuration and auto-applied policies matched by jurisdiction or policy category. Present when the governance agent supports policy resolution.", "items": { "type": "object", "properties": { "policy_id": { "type": "string", + "maxLength": 255, "description": "Registry policy ID.", "x-entity": "governance_registry_policy" }, @@ -85,6 +91,7 @@ }, "reason": { "type": "string", + "maxLength": 2000, "description": "Why this policy was included (e.g., 'Matched jurisdiction US and policy category pharmaceutical_advertising')." } }, diff --git a/static/schemas/source/media-buy/build-creative-request.json b/static/schemas/source/media-buy/build-creative-request.json index b97c811542e..a4d6141f8f3 100644 --- a/static/schemas/source/media-buy/build-creative-request.json +++ b/static/schemas/source/media-buy/build-creative-request.json @@ -274,6 +274,7 @@ }, "signal_conditions": { "type": "array", + "maxItems": 100, "x-status": "experimental", "minItems": 1, "items": { @@ -283,6 +284,7 @@ "properties": { "signal_agent_segment_id": { "type": "string", + "maxLength": 255, "x-entity": "signal_activation_id", "description": "Optional opaque resolved-segment handle for this fan-out condition — the RESOLVED condition identity, distinct from signal_ref's DEFINITION identity. When get_signals or a product signal_targeting_options entry exposed a signal_agent_segment_id for the targeted signal, echo it here verbatim so the produced creative's signal_condition carries the resolved-segment identity that the trafficking-compatibility check (SIGNAL_TARGETING_INCOMPATIBLE) matches on exactly. Providers MAY namespace it (e.g. provider_a:weather:rain_realtime vs provider_b:precip:high) so cross-provider conditions stay distinct without a shared taxonomy registry; treat as opaque, do not parse the namespace for business logic. Prefer it over reconstructing condition identity from categorical values — categorical {signal_ref,value} identity is the weaker fallback, appropriate only for inherently-categorical signals with no resolved handle, and never a cross-provider equivalence claim." } diff --git a/static/schemas/source/media-buy/build-creative-response.json b/static/schemas/source/media-buy/build-creative-response.json index 1a4769c3097..f88dbbd1e68 100644 --- a/static/schemas/source/media-buy/build-creative-response.json +++ b/static/schemas/source/media-buy/build-creative-response.json @@ -389,6 +389,7 @@ "properties": { "features": { "type": "array", + "maxItems": 32, "description": "Creative-feature values the evaluator measured for this leaf — `creative-feature-result[]` (e.g., a `creative_quality_score` number, an `on_brief` categorical, a calibrated `predicted_performance` in [0,1] from the exemplars form). The gate (evaluator.feature_requirement[]) and ranking (evaluator.rank_by) are evaluated over these values. Same shape get_creative_features returns.", "items": { "$ref": "/schemas/creative/creative-feature-result.json" diff --git a/static/schemas/source/media-buy/get-media-buy-delivery-response.json b/static/schemas/source/media-buy/get-media-buy-delivery-response.json index af98da6c1a7..32befc16261 100644 --- a/static/schemas/source/media-buy/get-media-buy-delivery-response.json +++ b/static/schemas/source/media-buy/get-media-buy-delivery-response.json @@ -968,6 +968,7 @@ "replaces_spot_id": { "x-added-in": "3.3.0", "type": "string", + "maxLength": 255, "minLength": 1, "x-status": "experimental", "description": "The spot_id of the preempted spot that this replacement airing replaces. Required when spot_status is makegood. A planned replacement carries it from the time it is scheduled, so the buyer sees the link before the spot airs; it keeps the value if it is then preempted, which preserves the chain back to the original spot. MUST be absent on aired rows and on rows without spot_status. The replaced spot_id SHOULD appear in the same response as a preempted row when it falls in the reporting period.", @@ -991,6 +992,7 @@ }, "break_id": { "type": "string", + "maxLength": 255, "minLength": 1, "description": "Optional seller-scoped identifier for the break. Spots that share a break_id ran in the same break." } diff --git a/static/schemas/source/media-buy/get-media-buy-issue-request.json b/static/schemas/source/media-buy/get-media-buy-issue-request.json index b9062fd7eb0..f33aca65f82 100644 --- a/static/schemas/source/media-buy/get-media-buy-issue-request.json +++ b/static/schemas/source/media-buy/get-media-buy-issue-request.json @@ -22,6 +22,7 @@ }, "media_buy_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-entity": "media_buy" }, @@ -33,6 +34,7 @@ }, "issue_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-entity": "media_buy_issue" }, diff --git a/static/schemas/source/media-buy/get-media-buy-issue-response.json b/static/schemas/source/media-buy/get-media-buy-issue-response.json index 32106b88271..92aa748254e 100644 --- a/static/schemas/source/media-buy/get-media-buy-issue-response.json +++ b/static/schemas/source/media-buy/get-media-buy-issue-response.json @@ -42,6 +42,7 @@ }, "errors": { "type": "array", + "maxItems": 100, "minItems": 1, "items": { "$ref": "/schemas/core/error.json" diff --git a/static/schemas/source/media-buy/get-media-buys-response.json b/static/schemas/source/media-buy/get-media-buys-response.json index 65b519dd80e..2a7d8361253 100644 --- a/static/schemas/source/media-buy/get-media-buys-response.json +++ b/static/schemas/source/media-buy/get-media-buys-response.json @@ -61,6 +61,7 @@ "x-status": "experimental", "x-added-in": "3.3.0", "type": "string", + "maxLength": 255, "x-entity": "media_buy", "description": "Media buy this one succeeds, as set at creation. Same seller and account; the predecessor carries no reverse link and may no longer be retrievable. Sellers MUST echo it for buys created with it. Experimental in AdCP 3.3 (`media_buy.lineage`)." }, @@ -531,6 +532,7 @@ }, "trackers": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/core/assignment-tracker.json" }, "description": "The complete assignment-scoped tracker list for this creative on this package, retaining the accepted URL templates, events, multiplicity, and order. Sellers supporting creative.supports_assignment_trackers MUST return this array, using [] when no assignment trackers exist. Excludes the creative's own trackers, which remain in its assets and also fire for this placement; this is not a combined effective tracker list.", "x-added-in": "3.3.0" diff --git a/static/schemas/source/media-buy/get-reporting-status-request.json b/static/schemas/source/media-buy/get-reporting-status-request.json index 18774873302..27ab2de6577 100644 --- a/static/schemas/source/media-buy/get-reporting-status-request.json +++ b/static/schemas/source/media-buy/get-reporting-status-request.json @@ -39,7 +39,7 @@ "view": { "$ref": "#/definitions/ReportingStatusView" }, "media_buy_ids": { "type": "array", "items": { "$ref": "/schemas/core/reporting-coverage.json#/definitions/ReportingMediaBuyId" }, "minItems": 1, "maxItems": 100, "uniqueItems": true, "description": "Optional summary/periods scope. Omit for every accessible media buy in the account." }, "delivery_config_ids": { "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[A-Za-z0-9_.:-]{1,64}$", "x-entity": "reporting_delivery_config" }, "minItems": 1, "maxItems": 16, "uniqueItems": true, "description": "Optional summary/periods scope. Use to reconcile billing, analytics, and pacing independently. Omit for every active caller-owned configuration." }, - "feed_purposes": { "type": "array", "items": { "$ref": "/schemas/core/reporting-delivery-offering.json#/definitions/ReportingFeedPurpose" }, "minItems": 1, "uniqueItems": true, "description": "Optional summary/periods feed filter. The response echoes exact resolved configuration generations so this never creates an opaque aggregate." }, + "feed_purposes": { "type": "array", "maxItems": 32, "items": { "$ref": "/schemas/core/reporting-delivery-offering.json#/definitions/ReportingFeedPurpose" }, "minItems": 1, "uniqueItems": true, "description": "Optional summary/periods feed filter. The response echoes exact resolved configuration generations so this never creates an opaque aggregate." }, "period": { "type": "object", "description": "Half-open summary/periods horizon. Omit for the seller's documented operational default horizon; the response always echoes the evaluated scope.", @@ -50,8 +50,8 @@ "required": ["start", "end"], "additionalProperties": false }, - "health": { "type": "array", "items": { "$ref": "/schemas/enums/reporting-health.json" }, "minItems": 1, "uniqueItems": true, "description": "Periods-view result filter only; it never changes summary health." }, - "finality": { "type": "array", "items": { "$ref": "/schemas/enums/reporting-finality.json" }, "minItems": 1, "uniqueItems": true }, + "health": { "type": "array", "maxItems": 32, "items": { "$ref": "/schemas/enums/reporting-health.json" }, "minItems": 1, "uniqueItems": true, "description": "Periods-view result filter only; it never changes summary health." }, + "finality": { "type": "array", "maxItems": 32, "items": { "$ref": "/schemas/enums/reporting-finality.json" }, "minItems": 1, "uniqueItems": true }, "reporting_revision_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_revision", "description": "Exact retained revision to resolve in revision view." }, "changes_after": { "type": "string", "minLength": 1, "maxLength": 2048, "description": "Periods-view incremental-repair checkpoint previously returned as changes_checkpoint after fully consuming a response. Returns newly committed obligations, revisions, adjustments, materializations, consumer status statements, revision receipts, and adjustment receipts plus the current projection of each affected obligation. Omit for a full ledger read." }, "pagination": { "$ref": "/schemas/core/pagination-request.json", "description": "Periods or revision-view pagination. Cursors are bound to the authenticated caller, account, filters, and ledger snapshot." }, diff --git a/static/schemas/source/media-buy/get-reporting-status-response.json b/static/schemas/source/media-buy/get-reporting-status-response.json index a4a51c68685..c6f57a4bec2 100644 --- a/static/schemas/source/media-buy/get-reporting-status-response.json +++ b/static/schemas/source/media-buy/get-reporting-status-response.json @@ -44,7 +44,7 @@ "ledger_snapshot_id": { "type": "string", "minLength": 1, "maxLength": 255, "description": "Opaque identity of the seller's consistent reporting-ledger snapshot. Every page reached from one periods cursor MUST return the same value." }, "ledger_as_of": { "type": "string", "format": "date-time", "description": "Exclusive observation boundary for ledger_snapshot_id. Revisions committed later appear only in a later reconciliation." }, "changes_checkpoint": { "type": "string", "minLength": 1, "maxLength": 2048, "description": "Opaque durable incremental-repair checkpoint for this periods snapshot. Consumers persist it only after consuming every page, then send it as changes_after. It is bound to authenticated caller, account, and filters and MUST order every committed obligation, revision, adjustment, materialization, consumer status statement, revision receipt, and adjustment receipt without gaps." }, - "account_id": { "type": "string", "minLength": 1, "x-entity": "account", "description": "Resolved seller/storefront account identifier." }, + "account_id": { "type": "string", "maxLength": 255, "minLength": 1, "x-entity": "account", "description": "Resolved seller/storefront account identifier." }, "scope": { "type": "object", "description": "Exact denominator evaluated for summary or periods health. complete is valid only when scope_closed is true.", @@ -52,10 +52,11 @@ "period_start": { "type": "string", "format": "date-time" }, "period_end": { "type": "string", "format": "date-time" }, "scope_closed": { "type": "boolean", "description": "True only when no new obligation can enter this evaluated scope." }, - "media_buy_ids": { "type": "array", "items": { "$ref": "/schemas/core/reporting-coverage.json#/definitions/ReportingMediaBuyId" }, "uniqueItems": true }, + "media_buy_ids": { "type": "array", "maxItems": 1000, "items": { "$ref": "/schemas/core/reporting-coverage.json#/definitions/ReportingMediaBuyId" }, "uniqueItems": true }, "all_accessible_media_buys": { "type": "boolean", "description": "True when media_buy_ids was omitted and the scope covers all caller-accessible account buys." }, "delivery_config_generations": { "type": "array", + "maxItems": 1000, "description": "Exact independently reconciled configuration generations in the denominator. A generation derived from a reporting subscription is listed once per resolved offering, with offering_id, because one subscription version can resolve several offerings (match all, different products, or a resolution change).", "items": { "type": "object", @@ -70,8 +71,8 @@ }, "uniqueItems": true }, - "feed_purposes": { "type": "array", "items": { "$ref": "/schemas/core/reporting-delivery-offering.json#/definitions/ReportingFeedPurpose" }, "uniqueItems": true }, - "finality": { "type": "array", "items": { "$ref": "/schemas/enums/reporting-finality.json" }, "uniqueItems": true }, + "feed_purposes": { "type": "array", "maxItems": 32, "items": { "$ref": "/schemas/core/reporting-delivery-offering.json#/definitions/ReportingFeedPurpose" }, "uniqueItems": true }, + "finality": { "type": "array", "maxItems": 32, "items": { "$ref": "/schemas/enums/reporting-finality.json" }, "uniqueItems": true }, "ledger_retained_from": { "type": "string", "format": "date-time", "description": "Earliest period boundary for which anti-entropy metadata is retained for every selected configuration generation." }, "coverage_complete": { "type": "boolean", "description": "Whether the requested horizon is fully inside retained ledger coverage. False means health cannot prove completeness for the whole requested horizon." } }, @@ -102,18 +103,18 @@ "required": ["total", "waiting", "healthy", "delayed", "action_required", "complete"], "additionalProperties": false }, - "issues": { "type": "array", "items": { "$ref": "/schemas/core/reporting-status-issue.json" } }, - "periods": { "type": "array", "items": { "$ref": "/schemas/core/reporting-obligation.json" } }, - "revisions": { "type": "array", "items": { "$ref": "/schemas/core/reporting-revision.json" }, "description": "Revision ledger records on this page. Pagination is over the flat union of obligations, revisions, adjustments, materializations, consumer status statements, revision receipts, and adjustment receipts, avoiding unbounded nested history." }, - "adjustments": { "type": "array", "items": { "$ref": "/schemas/core/reporting-adjustment.json" }, "description": "Immutable post-official accounting corrections on this page. They preserve the original invoice-to-revision binding and are included in flat ledger pagination." }, - "consumer_statuses": { "type": "array", "items": { "$ref": "/schemas/core/reporting-consumer-status.json" }, "description": "Authenticated caller's append-only reporting status history on this page. Current leaves are identified by obligation current_consumer_status_id or, for a missing seller obligation, by the supersession chain over configuration generation, report definition, offering when the generation is subscription-derived, and period. No other consumer's status is disclosed." }, - "adjustment_receipts": { "type": "array", "items": { "$ref": "/schemas/core/reporting-adjustment-receipt.json" }, "description": "Authenticated Reconciled Billing outcomes for adjustments on this page." }, + "issues": { "type": "array", "maxItems": 100, "items": { "$ref": "/schemas/core/reporting-status-issue.json" } }, + "periods": { "type": "array", "maxItems": 1000, "items": { "$ref": "/schemas/core/reporting-obligation.json" } }, + "revisions": { "type": "array", "maxItems": 1000, "items": { "$ref": "/schemas/core/reporting-revision.json" }, "description": "Revision ledger records on this page. Pagination is over the flat union of obligations, revisions, adjustments, materializations, consumer status statements, revision receipts, and adjustment receipts, avoiding unbounded nested history." }, + "adjustments": { "type": "array", "maxItems": 1000, "items": { "$ref": "/schemas/core/reporting-adjustment.json" }, "description": "Immutable post-official accounting corrections on this page. They preserve the original invoice-to-revision binding and are included in flat ledger pagination." }, + "consumer_statuses": { "type": "array", "maxItems": 1000, "items": { "$ref": "/schemas/core/reporting-consumer-status.json" }, "description": "Authenticated caller's append-only reporting status history on this page. Current leaves are identified by obligation current_consumer_status_id or, for a missing seller obligation, by the supersession chain over configuration generation, report definition, offering when the generation is subscription-derived, and period. No other consumer's status is disclosed." }, + "adjustment_receipts": { "type": "array", "maxItems": 1000, "items": { "$ref": "/schemas/core/reporting-adjustment-receipt.json" }, "description": "Authenticated Reconciled Billing outcomes for adjustments on this page." }, "pagination": { "$ref": "/schemas/core/pagination-response.json" }, "revision": { "$ref": "/schemas/core/reporting-revision.json" }, - "materializations": { "type": "array", "items": { "$ref": "/schemas/core/reporting-materialization.json" } }, - "receipts": { "type": "array", "items": { "$ref": "/schemas/core/reporting-receipt.json" }, "description": "Authenticated caller's durable reconciliation receipts. Receipts from another consumer principal are never disclosed." }, - "subscription_coverage": { "type": "array", "x-status": "experimental", "x-added-in": "3.3.0", "items": { "$ref": "/schemas/core/reporting-subscription-coverage.json" }, "description": "Summary and periods views (experimental, media_buy.reporting_subscriptions): coverage exceptions, one entry per caller reporting subscription whose scope includes this account, including inactive subscriptions with retained obligations, which carry status inactive, and subscriptions the account was removed from in place while its excluded_by_buyer entry is retained. Omitted when the seller does not advertise subscriptions." }, - "errors": { "type": "array", "items": { "$ref": "/schemas/core/error.json" } }, + "materializations": { "type": "array", "maxItems": 1000, "items": { "$ref": "/schemas/core/reporting-materialization.json" } }, + "receipts": { "type": "array", "maxItems": 1000, "items": { "$ref": "/schemas/core/reporting-receipt.json" }, "description": "Authenticated caller's durable reconciliation receipts. Receipts from another consumer principal are never disclosed." }, + "subscription_coverage": { "type": "array", "maxItems": 1000, "x-status": "experimental", "x-added-in": "3.3.0", "items": { "$ref": "/schemas/core/reporting-subscription-coverage.json" }, "description": "Summary and periods views (experimental, media_buy.reporting_subscriptions): coverage exceptions, one entry per caller reporting subscription whose scope includes this account, including inactive subscriptions with retained obligations, which carry status inactive, and subscriptions the account was removed from in place while its excluded_by_buyer entry is retained. Omitted when the seller does not advertise subscriptions." }, + "errors": { "type": "array", "maxItems": 100, "items": { "$ref": "/schemas/core/error.json" } }, "context": { "$ref": "/schemas/core/context.json" }, "ext": { "$ref": "/schemas/core/ext.json" } }, @@ -195,7 +196,7 @@ "view": { "enum": ["summary", "periods", "revision"] }, "failure_kind": { "type": "string", "const": "operational" }, "context": { "$ref": "/schemas/core/context.json" }, - "errors": { "type": "array", "items": { "$ref": "/schemas/core/error.json" }, "minItems": 1 } + "errors": { "type": "array", "maxItems": 100, "items": { "$ref": "/schemas/core/error.json" }, "minItems": 1 } }, "required": ["status", "view", "failure_kind", "errors"], "additionalProperties": true, diff --git a/static/schemas/source/media-buy/list-collections-request.json b/static/schemas/source/media-buy/list-collections-request.json index 5d454f6dce0..27973e78304 100644 --- a/static/schemas/source/media-buy/list-collections-request.json +++ b/static/schemas/source/media-buy/list-collections-request.json @@ -35,6 +35,7 @@ "properties": { "kinds": { "type": "array", + "maxItems": 32, "description": "Include only collections of these kinds. Same semantics as kinds in collection/collection-list-filters.json.", "items": { "$ref": "/schemas/enums/collection-kind.json" }, "minItems": 1, @@ -42,14 +43,16 @@ }, "genres_include": { "type": "array", + "maxItems": 100, "description": "Include only collections with any of these genres; collections without genre metadata are excluded. Values are interpreted against genre_taxonomy when present. Same semantics as in collection/collection-list-filters.json.", - "items": { "type": "string", "minLength": 1 }, + "items": { "type": "string", "maxLength": 500, "minLength": 1 }, "minItems": 1 }, "genres_exclude": { "type": "array", + "maxItems": 100, "description": "Exclude collections tagged with any of these genres, applied after genres_include. Values are interpreted against genre_taxonomy when present.", - "items": { "type": "string", "minLength": 1 }, + "items": { "type": "string", "maxLength": 500, "minLength": 1 }, "minItems": 1 }, "genre_taxonomy": { @@ -58,6 +61,7 @@ }, "statuses": { "type": "array", + "maxItems": 32, "description": "Include only collections with any of these statuses.", "items": { "$ref": "/schemas/enums/collection-status.json" }, "minItems": 1, @@ -65,6 +69,7 @@ }, "languages": { "type": "array", + "maxItems": 256, "description": "Include only collections whose language matches any of these BCP 47 language ranges under RFC 4647 basic filtering, compared case-insensitively: 'en' matches 'en' and 'en-US', but 'en-US' does not match 'en'.", "items": { "$ref": "/schemas/core/locale-tag.json" }, "minItems": 1, @@ -72,12 +77,14 @@ }, "talent": { "type": "array", + "maxItems": 100, "description": "Include only collections with a talent entry whose brand_ref matches any of these brands. Only domain and brand_id are compared, as on talent; brand_id omitted matches any brand_ref at that domain.", "items": { "type": "object", "properties": { "domain": { "type": "string", + "maxLength": 253, "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" }, "brand_id": { "$ref": "/schemas/core/brand-id.json" } @@ -89,9 +96,11 @@ }, "platforms": { "type": "array", + "maxItems": 32, "description": "Include only collections with a distribution entry whose publisher_domain is any of these domains.", "items": { "type": "string", + "maxLength": 255, "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" }, "minItems": 1, @@ -99,6 +108,7 @@ }, "name_contains": { "type": "string", + "maxLength": 255, "minLength": 1, "description": "Include only collections whose name contains this string, compared case-insensitively." } @@ -111,6 +121,7 @@ }, "if_collections_version": { "type": "string", + "maxLength": 255, "minLength": 1, "description": "Opaque collections_version from a prior list_collections response for the same scope: the canonicalized collections selectors and filters (arrays compared as sets, pagination.cursor excluded), plus account identity when that response's cache_scope was account. When it matches, the seller returns outcome unchanged without collections. A token from a different scope is a mismatch and gets a full listed response. Unrelated to feed_version and wholesale_feed_version. A webhook-fed mirror repairing after a gap sends its last applied version, never a newer webhook version." }, diff --git a/static/schemas/source/media-buy/list-collections-response.json b/static/schemas/source/media-buy/list-collections-response.json index 86e71620a42..14755846205 100644 --- a/static/schemas/source/media-buy/list-collections-response.json +++ b/static/schemas/source/media-buy/list-collections-response.json @@ -25,6 +25,7 @@ "pagination": { "$ref": "/schemas/core/pagination-response.json" }, "collections_version": { "type": "string", + "maxLength": 255, "minLength": 1, "description": "Opaque version of the selected catalog, scoped to the canonicalized collections selectors and filters (arrays compared as sets, pagination.cursor excluded), plus account identity when cache_scope is account. It changes whenever any copy the selection would return, or the set of collections it selects, changes. A follower refresh that leaves a count's bounds and precision unchanged is not a change. Independent of feed_version and wholesale_feed_version: a change to one says nothing about the others. The unfiltered read (no collections selectors, no filters) carries the same version token as collection_card.* and collection_catalog.bulk_change webhooks for that cache_scope." }, diff --git a/static/schemas/source/media-buy/list-proposals-request.json b/static/schemas/source/media-buy/list-proposals-request.json index 240986ad2bb..e556320a02f 100644 --- a/static/schemas/source/media-buy/list-proposals-request.json +++ b/static/schemas/source/media-buy/list-proposals-request.json @@ -21,6 +21,7 @@ }, "context_id": { "type": "string", + "maxLength": 255, "minLength": 1, "description": "MCP compatibility field: servers ignore this value; A2A uses transport-native Message/Task contextId." }, @@ -55,7 +56,7 @@ "media_buy_ids": { "type": "array", "description": "Return only proposals whose snapshot media_buy_id is one of these buys: seller offers and other amendments against those buys, plus the accepted snapshots that created them. Proposals with no media_buy_id are returned only when no media_buy_ids filter is supplied. Unknown or inaccessible IDs are omitted, not errors. Combines with the other filters as an AND.", - "items": { "type": "string", "minLength": 1, "x-entity": "media_buy" }, + "items": { "type": "string", "maxLength": 255, "minLength": 1, "x-entity": "media_buy" }, "minItems": 1, "maxItems": 50, "uniqueItems": true @@ -70,12 +71,13 @@ }, "dispositions": { "type": "array", + "maxItems": 32, "description": "Return only proposals in these dispositions. Defaults to every disposition. Terminal snapshots are retained for at least 30 days after their disposition changed.", "items": { "$ref": "/schemas/enums/proposal-disposition.json" }, "minItems": 1, "uniqueItems": true }, - "cursor": { "type": "string", "minLength": 1 }, + "cursor": { "type": "string", "maxLength": 4096, "minLength": 1 }, "max_results": { "type": "integer", "minimum": 1, "maximum": 100, "default": 25 }, "ext": { "$ref": "/schemas/core/ext.json" } }, diff --git a/static/schemas/source/media-buy/list-proposals-response.json b/static/schemas/source/media-buy/list-proposals-response.json index ef957b1af89..18ebf4d83b9 100644 --- a/static/schemas/source/media-buy/list-proposals-response.json +++ b/static/schemas/source/media-buy/list-proposals-response.json @@ -13,6 +13,7 @@ "outcome": { "type": "string", "const": "listed" }, "proposals": { "type": "array", + "maxItems": 100, "items": { "type": "object", "properties": { @@ -91,6 +92,7 @@ }, "opportunities": { "type": "array", + "maxItems": 100, "description": "Current state of each opportunity referenced by a returned proposal or named in opportunity_ids. One entry per opportunity_id; unknown or inaccessible opportunity IDs are omitted, not errors.", "items": { "type": "object", @@ -127,7 +129,7 @@ "additionalProperties": false } }, - "next_cursor": { "type": "string", "minLength": 1 }, + "next_cursor": { "type": "string", "maxLength": 4096, "minLength": 1 }, "context": { "$ref": "/schemas/core/context.json" }, "ext": { "$ref": "/schemas/core/ext.json" } }, diff --git a/static/schemas/source/media-buy/provide-performance-feedback-response.json b/static/schemas/source/media-buy/provide-performance-feedback-response.json index 3341f553c4f..39a6e30550b 100644 --- a/static/schemas/source/media-buy/provide-performance-feedback-response.json +++ b/static/schemas/source/media-buy/provide-performance-feedback-response.json @@ -22,6 +22,7 @@ }, "feedback_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-status": "experimental", "description": "Receiver-issued identifier for this immutable assertion. Orchestrator gateways and sellers declaring media_buy.performance_feedback MUST return it; legacy sellers may omit it. The identifier is local to the receiving hop. Use it in supersedes_feedback_id when revising that hop's assertion." diff --git a/static/schemas/source/media-buy/report-media-buy-issue-request.json b/static/schemas/source/media-buy/report-media-buy-issue-request.json index 388c29338f3..cc7d662cf21 100644 --- a/static/schemas/source/media-buy/report-media-buy-issue-request.json +++ b/static/schemas/source/media-buy/report-media-buy-issue-request.json @@ -23,6 +23,7 @@ }, "media_buy_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-entity": "media_buy" }, @@ -40,11 +41,13 @@ }, "package_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-entity": "package" }, "creative_id": { "type": "string", + "maxLength": 255, "minLength": 1, "x-entity": "creative" }, diff --git a/static/schemas/source/media-buy/report-media-buy-issue-response.json b/static/schemas/source/media-buy/report-media-buy-issue-response.json index 5f01c4e5a6d..7338f6b8b2e 100644 --- a/static/schemas/source/media-buy/report-media-buy-issue-response.json +++ b/static/schemas/source/media-buy/report-media-buy-issue-response.json @@ -42,6 +42,7 @@ }, "errors": { "type": "array", + "maxItems": 100, "minItems": 1, "items": { "$ref": "/schemas/core/error.json" diff --git a/static/schemas/source/media-buy/sync-audiences-response.json b/static/schemas/source/media-buy/sync-audiences-response.json index 4f0cc4c53a7..585641749ff 100644 --- a/static/schemas/source/media-buy/sync-audiences-response.json +++ b/static/schemas/source/media-buy/sync-audiences-response.json @@ -33,6 +33,7 @@ "platform_id": { "x-added-in": "3.3.0", "type": "string", + "maxLength": 255, "description": "Platform-specific ID assigned to the audience by the seller's ad platform. Introduced in AdCP 3.3. When reporting a platform identifier in 3.3 and later 3.x responses, sellers MUST emit both platform_id and the deprecated seller_id alias with identical values. Buyers MUST prefer platform_id and fall back to seller_id only when platform_id is absent. This identifies the object on the platform, not the seller.", "$comment": "x-entity deliberately omitted: seller-opaque platform identifier; AdCP requests reference audience_id instead." }, @@ -150,16 +151,19 @@ }, "locator": { "type": "string", + "maxLength": 2048, "description": "Dataset locator, echoed from the request (kind: dataset)." }, "segment_ref": { "type": "string", + "maxLength": 255, "description": "Segment reference, echoed from the request (kind: platform_segment)." }, "columns_read": { "type": "array", + "maxItems": 100, "description": "Canonical identifier columns the seller actually read from the shared object on the most recent ingest (kind: dataset). Lets a buyer distinguish bad identifier data from a column the seller never read — match_breakdown reveals what resolved, not what was offered.", - "items": { "type": "string" }, + "items": { "type": "string", "maxLength": 500 }, "minItems": 1 }, "access_status": { diff --git a/static/schemas/source/media-buy/sync-event-sources-response.json b/static/schemas/source/media-buy/sync-event-sources-response.json index b814903e0c1..b0f5fd20793 100644 --- a/static/schemas/source/media-buy/sync-event-sources-response.json +++ b/static/schemas/source/media-buy/sync-event-sources-response.json @@ -33,6 +33,7 @@ "platform_id": { "x-added-in": "3.3.0", "type": "string", + "maxLength": 255, "description": "Platform-specific ID assigned to the event source by the seller's ad platform. Introduced in AdCP 3.3. When reporting a platform identifier in 3.3 and later 3.x responses, sellers MUST emit both platform_id and the deprecated seller_id alias with identical values. Buyers MUST prefer platform_id and fall back to seller_id only when platform_id is absent. This identifies the object on the platform, not the seller.", "$comment": "x-entity deliberately omitted: seller-opaque platform identifier; AdCP requests reference event_source_id instead." }, diff --git a/static/schemas/source/signals/get-signals-response.json b/static/schemas/source/signals/get-signals-response.json index 02a2ed94ca3..77e2eb180cb 100644 --- a/static/schemas/source/signals/get-signals-response.json +++ b/static/schemas/source/signals/get-signals-response.json @@ -103,6 +103,7 @@ }, "source_audience_id": { "type": "string", + "maxLength": 255, "x-status": "experimental", "x-added-in": "3.3.0", "description": "Seed audience this signal was derived from, for example a lookalike or custom segment built from a first-party seed. When present, this is the audience_id the buyer synced with sync_audiences (typically audience_type 'lookalike_seed') on the same account, at the agent that holds the seed. Lineage only: AdCP does not transport seed membership through get_signals, and the audience remains governed by its sync_audiences consent and residency terms. Agents MUST NOT return it to a caller that did not supply an account, or in a response with cache_scope 'public', because the value is buyer-scoped. Experimental (x-status: experimental): part of the signals.signal_lifecycle surface. Per docs/reference/experimental-status, this surface MAY change between 3.x releases with notice.", @@ -140,6 +141,7 @@ }, "signal_pricing_group_rules": { "type": "array", + "maxItems": 1000, "description": "Experimental (signals.pricing_groups). Signal-agent default rules for how fees of signals sharing a pricing_group combine. Product-scoped signal_targeting_rules.signal_pricing_group_rules override these for the same pricing_group. A group with no rule is charged 'each'.", "items": { "$ref": "/schemas/core/signal-pricing-group-rule.json" diff --git a/static/schemas/source/sponsored-intelligence/si-get-offering-request.json b/static/schemas/source/sponsored-intelligence/si-get-offering-request.json index a23dcae5822..df4972a9c9f 100644 --- a/static/schemas/source/sponsored-intelligence/si-get-offering-request.json +++ b/static/schemas/source/sponsored-intelligence/si-get-offering-request.json @@ -13,11 +13,13 @@ "properties": { "offering_id": { "type": "string", + "maxLength": 255, "description": "Offering identifier from the catalog to get details for", "x-entity": "offering" }, "intent": { "type": "string", + "maxLength": 255, "description": "Optional natural language description of user intent for personalized results (e.g., 'mens size 14 near Cincinnati'). Must be anonymous - no PII." }, "context": { diff --git a/static/schemas/source/sponsored-intelligence/si-get-offering-response.json b/static/schemas/source/sponsored-intelligence/si-get-offering-response.json index e42a45ca77e..e3a50c31077 100644 --- a/static/schemas/source/sponsored-intelligence/si-get-offering-response.json +++ b/static/schemas/source/sponsored-intelligence/si-get-offering-response.json @@ -17,6 +17,7 @@ }, "offering_token": { "type": "string", + "maxLength": 4096, "description": "Token to pass to si_initiate_session for session continuity. Brand stores the full query context server-side (products shown, order, context) so they can resolve references like 'the second one' when the session starts." }, "ttl_seconds": { @@ -35,19 +36,23 @@ "properties": { "offering_id": { "type": "string", + "maxLength": 255, "description": "Offering identifier", "x-entity": "offering" }, "title": { "type": "string", + "maxLength": 2000, "description": "Offering title" }, "summary": { "type": "string", + "maxLength": 2000, "description": "Brief summary of the offering" }, "tagline": { "type": "string", + "maxLength": 255, "description": "Short promotional tagline" }, "expires_at": { @@ -61,6 +66,7 @@ }, "price_hint": { "type": "string", + "maxLength": 64, "description": "Price indication (e.g., 'from $199', '50% off')" }, "image_url": { @@ -78,25 +84,30 @@ }, "matching_products": { "type": "array", + "maxItems": 100, "description": "Products matching the request context. Only included if include_products was true.", "items": { "type": "object", "properties": { "product_id": { "type": "string", + "maxLength": 255, "description": "Product identifier", "x-entity": "product" }, "name": { "type": "string", + "maxLength": 255, "description": "Product name" }, "price": { "type": "string", + "maxLength": 64, "description": "Display price (e.g., '$129', '$89.99')" }, "original_price": { "type": "string", + "maxLength": 64, "description": "Original price if on sale" }, "image_url": { @@ -106,6 +117,7 @@ }, "availability_summary": { "type": "string", + "maxLength": 2000, "description": "Brief availability info (e.g., 'In stock', 'Size 14 available', '3 left')" }, "availability_status": { @@ -136,18 +148,22 @@ }, "unavailable_reason": { "type": "string", + "maxLength": 2000, "description": "If not available, why (e.g., 'expired', 'sold_out', 'region_restricted')" }, "alternative_offering_ids": { "type": "array", + "maxItems": 1000, "items": { "type": "string", + "maxLength": 255, "x-entity": "offering" }, "description": "Alternative offerings to consider if this one is unavailable" }, "errors": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/core/error.json" }, diff --git a/static/schemas/source/sponsored-intelligence/si-identity.json b/static/schemas/source/sponsored-intelligence/si-identity.json index 0fb1b253298..33ff11e0bdf 100644 --- a/static/schemas/source/sponsored-intelligence/si-identity.json +++ b/static/schemas/source/sponsored-intelligence/si-identity.json @@ -17,6 +17,7 @@ }, "consent_scope": { "type": "array", + "maxItems": 32, "items": { "type": "string", "enum": ["name", "email", "shipping_address", "phone", "locale"] @@ -34,6 +35,7 @@ }, "brand_policy_version": { "type": "string", + "maxLength": 64, "description": "Version of policy acknowledged" } }, @@ -50,25 +52,28 @@ }, "name": { "type": "string", + "maxLength": 255, "description": "User's display name" }, "locale": { "type": "string", + "maxLength": 64, "description": "User's locale (e.g., en-US)" }, "phone": { "type": "string", + "maxLength": 30, "description": "User's phone number" }, "shipping_address": { "type": "object", "description": "User's shipping address for accurate pricing", "properties": { - "street": { "type": "string" }, - "city": { "type": "string" }, - "state": { "type": "string" }, - "postal_code": { "type": "string" }, - "country": { "type": "string" } + "street": { "type": "string", "maxLength": 200 }, + "city": { "type": "string", "maxLength": 100 }, + "state": { "type": "string", "maxLength": 100 }, + "postal_code": { "type": "string", "maxLength": 64 }, + "country": { "type": "string", "maxLength": 64 } }, "additionalProperties": true } @@ -77,6 +82,7 @@ }, "anonymous_session_id": { "type": "string", + "maxLength": 255, "description": "Session ID for anonymous users (when consent_granted is false)", "x-entity": "si_session" } diff --git a/static/schemas/source/sponsored-intelligence/si-initiate-session-request.json b/static/schemas/source/sponsored-intelligence/si-initiate-session-request.json index c3ac6efe150..b6a2cf33c9d 100644 --- a/static/schemas/source/sponsored-intelligence/si-initiate-session-request.json +++ b/static/schemas/source/sponsored-intelligence/si-initiate-session-request.json @@ -14,6 +14,7 @@ "properties": { "intent": { "type": "string", + "maxLength": 255, "description": "Natural language description of user intent — the conversation handoff from the host describing what the user needs from the brand agent" }, "context": { @@ -24,15 +25,18 @@ }, "media_buy_id": { "type": "string", + "maxLength": 255, "description": "AdCP media buy ID if session was triggered by advertising", "x-entity": "media_buy" }, "placement": { "type": "string", + "maxLength": 500, "description": "Where this session was triggered (e.g., 'chatgpt_search', 'claude_chat')" }, "offering_id": { "type": "string", + "maxLength": 255, "description": "Brand-specific offering identifier to apply", "x-entity": "offering" }, @@ -42,6 +46,7 @@ }, "offering_token": { "type": "string", + "maxLength": 4096, "description": "Token from si_get_offering response for session continuity. Brand uses this to recall what products were shown to the user, enabling natural references like 'the second one' or 'that blue shoe'." }, "sponsored_context_receipt": { diff --git a/static/schemas/source/sponsored-intelligence/si-initiate-session-response.json b/static/schemas/source/sponsored-intelligence/si-initiate-session-response.json index 67e80dab9e4..e83d4cb356b 100644 --- a/static/schemas/source/sponsored-intelligence/si-initiate-session-response.json +++ b/static/schemas/source/sponsored-intelligence/si-initiate-session-response.json @@ -13,6 +13,7 @@ "properties": { "session_id": { "type": "string", + "maxLength": 255, "description": "Unique session identifier for subsequent messages", "x-entity": "si_session" }, @@ -22,10 +23,12 @@ "properties": { "message": { "type": "string", + "maxLength": 2000, "description": "Conversational message from brand agent" }, "ui_elements": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/sponsored-intelligence/si-ui-element.json" }, @@ -53,6 +56,7 @@ }, "errors": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/core/error.json" }, diff --git a/static/schemas/source/sponsored-intelligence/si-send-message-request.json b/static/schemas/source/sponsored-intelligence/si-send-message-request.json index 498a441c9d7..5c649bfb860 100644 --- a/static/schemas/source/sponsored-intelligence/si-send-message-request.json +++ b/static/schemas/source/sponsored-intelligence/si-send-message-request.json @@ -21,11 +21,13 @@ }, "session_id": { "type": "string", + "maxLength": 255, "description": "Active session identifier", "x-entity": "si_session" }, "message": { "type": "string", + "maxLength": 2000, "description": "User's message to the brand agent" }, "action_response": { @@ -34,6 +36,7 @@ "properties": { "action": { "type": "string", + "maxLength": 255, "description": "The action that was triggered" }, "payload": { diff --git a/static/schemas/source/sponsored-intelligence/si-send-message-response.json b/static/schemas/source/sponsored-intelligence/si-send-message-response.json index 2bc54ce1183..8908df502bb 100644 --- a/static/schemas/source/sponsored-intelligence/si-send-message-response.json +++ b/static/schemas/source/sponsored-intelligence/si-send-message-response.json @@ -13,6 +13,7 @@ "properties": { "session_id": { "type": "string", + "maxLength": 255, "description": "Session identifier", "x-entity": "si_session" }, @@ -22,6 +23,7 @@ "properties": { "message": { "type": "string", + "maxLength": 2000, "description": "Conversational message from brand agent" }, "surface": { @@ -30,6 +32,7 @@ }, "ui_elements": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/sponsored-intelligence/si-ui-element.json" }, @@ -41,6 +44,7 @@ }, "mcp_resource_uri": { "type": "string", + "maxLength": 2048, "description": "MCP resource URI for hosts with MCP Apps support (e.g., ui://si/session-abc123)" }, "sponsored_context": { @@ -69,6 +73,7 @@ "properties": { "action": { "type": "string", + "maxLength": 255, "description": "The commerce action (e.g., 'purchase')" }, "product": { @@ -83,7 +88,8 @@ "type": "number" }, "currency": { - "type": "string" + "type": "string", + "maxLength": 64 } } } @@ -96,12 +102,15 @@ "properties": { "conversation_summary": { "type": "string", + "maxLength": 2000, "description": "Summary of the conversation leading to purchase" }, "applied_offers": { "type": "array", + "maxItems": 100, "items": { - "type": "string" + "type": "string", + "maxLength": 500 }, "description": "Offer IDs that were applied during the conversation" } @@ -113,6 +122,7 @@ }, "errors": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/core/error.json" } diff --git a/static/schemas/source/sponsored-intelligence/si-sponsored-context-receipt.json b/static/schemas/source/sponsored-intelligence/si-sponsored-context-receipt.json index 39a83b8dc03..b37bd463f51 100644 --- a/static/schemas/source/sponsored-intelligence/si-sponsored-context-receipt.json +++ b/static/schemas/source/sponsored-intelligence/si-sponsored-context-receipt.json @@ -33,6 +33,7 @@ }, "host_surface": { "type": "string", + "maxLength": 500, "description": "Host-defined surface or placement where the context was accepted, such as an assistant session, search result page, or comparison module." }, "disclosure_commitment": { @@ -49,10 +50,12 @@ }, "label_text": { "type": "string", + "maxLength": 2000, "description": "Disclosure label text the host committed to render, if different from or copied from the declaration." }, "notes": { "type": "string", + "maxLength": 2000, "description": "Optional host explanation for the disclosure commitment." } }, @@ -63,6 +66,7 @@ }, "rejection_reason": { "type": "string", + "maxLength": 2000, "description": "Optional explanation when status is rejected, for example unsupported context_use or inability to satisfy the disclosure obligation." } }, diff --git a/static/schemas/source/sponsored-intelligence/si-sponsored-context.json b/static/schemas/source/sponsored-intelligence/si-sponsored-context.json index 858aa193d70..caedb7d5546 100644 --- a/static/schemas/source/sponsored-intelligence/si-sponsored-context.json +++ b/static/schemas/source/sponsored-intelligence/si-sponsored-context.json @@ -20,6 +20,7 @@ "properties": { "account_id": { "type": "string", + "maxLength": 255, "description": "Seller-assigned account identifier for the paying principal.", "x-entity": "account" } @@ -31,12 +32,14 @@ }, "operator": { "type": "string", + "maxLength": 255, "description": "Domain of the operator acting for the paying principal, when different from the brand domain.", "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$", "x-entity": "operator" }, "display_name": { "type": "string", + "maxLength": 255, "description": "Human-readable label for disclosure rendering. The canonical identity remains the brand/account reference." } }, @@ -59,6 +62,7 @@ }, "label_text": { "type": "string", + "maxLength": 2000, "description": "Disclosure label text the host should render when disclosure is required." }, "timing": { @@ -91,20 +95,24 @@ }, "jurisdictions": { "type": "array", + "maxItems": 100, "description": "Jurisdictions where this declared disclosure obligation applies.", "items": { "type": "object", "properties": { "country": { "type": "string", + "maxLength": 64, "description": "ISO 3166-1 alpha-2 country code." }, "region": { "type": "string", + "maxLength": 64, "description": "Optional sub-national region code." }, "regulation": { "type": "string", + "maxLength": 500, "description": "Regulation or policy identifier." } }, diff --git a/static/schemas/source/sponsored-intelligence/si-terminate-session-request.json b/static/schemas/source/sponsored-intelligence/si-terminate-session-request.json index 8d95ac26568..aa4ce816acb 100644 --- a/static/schemas/source/sponsored-intelligence/si-terminate-session-request.json +++ b/static/schemas/source/sponsored-intelligence/si-terminate-session-request.json @@ -14,6 +14,7 @@ "properties": { "session_id": { "type": "string", + "maxLength": 255, "description": "Session identifier to terminate", "x-entity": "si_session" }, @@ -34,6 +35,7 @@ "properties": { "summary": { "type": "string", + "maxLength": 2000, "description": "Summary of the conversation" }, "transaction_intent": { @@ -56,6 +58,7 @@ }, "cause": { "type": "string", + "maxLength": 500, "description": "For host_terminated - why host ended session" } }, diff --git a/static/schemas/source/sponsored-intelligence/si-terminate-session-response.json b/static/schemas/source/sponsored-intelligence/si-terminate-session-response.json index 87ecb491d7d..4969d59ee5f 100644 --- a/static/schemas/source/sponsored-intelligence/si-terminate-session-response.json +++ b/static/schemas/source/sponsored-intelligence/si-terminate-session-response.json @@ -13,6 +13,7 @@ "properties": { "session_id": { "type": "string", + "maxLength": 255, "description": "Terminated session identifier", "x-entity": "si_session" }, @@ -35,6 +36,7 @@ }, "checkout_token": { "type": "string", + "maxLength": 4096, "description": "Opaque token for the checkout flow. The host passes this to the checkout endpoint to correlate the SI session with the transaction." }, "payload": { @@ -72,6 +74,7 @@ }, "errors": { "type": "array", + "maxItems": 100, "items": { "$ref": "/schemas/core/error.json" } diff --git a/static/schemas/source/sponsored-intelligence/si-ui-element.json b/static/schemas/source/sponsored-intelligence/si-ui-element.json index 75a3cedc9bd..757bc1e4316 100644 --- a/static/schemas/source/sponsored-intelligence/si-ui-element.json +++ b/static/schemas/source/sponsored-intelligence/si-ui-element.json @@ -27,7 +27,7 @@ "data": { "type": "object", "properties": { - "message": { "type": "string", "description": "Text message content" } + "message": { "type": "string", "maxLength": 2000, "description": "Text message content" } }, "required": ["message"] } @@ -42,7 +42,7 @@ "type": "object", "properties": { "url": { "type": "string", "format": "uri", "description": "Link URL" }, - "label": { "type": "string", "description": "Link text" }, + "label": { "type": "string", "maxLength": 255, "description": "Link text" }, "preview": { "type": "boolean", "description": "Show link preview" } }, "required": ["url", "label"] @@ -58,8 +58,8 @@ "type": "object", "properties": { "url": { "type": "string", "format": "uri", "description": "Image URL" }, - "alt": { "type": "string", "description": "Alt text" }, - "caption": { "type": "string", "description": "Image caption" } + "alt": { "type": "string", "maxLength": 2000, "description": "Alt text" }, + "caption": { "type": "string", "maxLength": 2000, "description": "Image caption" } }, "required": ["url", "alt"] } @@ -73,17 +73,17 @@ "data": { "type": "object", "properties": { - "title": { "type": "string", "description": "Product title" }, - "subtitle": { "type": "string", "description": "Product subtitle" }, - "price": { "type": "string", "description": "Price display string" }, + "title": { "type": "string", "maxLength": 2000, "description": "Product title" }, + "subtitle": { "type": "string", "maxLength": 255, "description": "Product subtitle" }, + "price": { "type": "string", "maxLength": 64, "description": "Price display string" }, "image_url": { "type": "string", "format": "uri", "description": "Product image" }, - "description": { "type": "string", "description": "Product description" }, - "badge": { "type": "string", "description": "Badge text (e.g., 'Free Upgrade')" }, + "description": { "type": "string", "maxLength": 2000, "description": "Product description" }, + "badge": { "type": "string", "maxLength": 255, "description": "Badge text (e.g., 'Free Upgrade')" }, "cta": { "type": "object", "properties": { - "label": { "type": "string" }, - "action": { "type": "string" } + "label": { "type": "string", "maxLength": 255 }, + "action": { "type": "string", "maxLength": 255 } } } }, @@ -99,9 +99,10 @@ "data": { "type": "object", "properties": { - "title": { "type": "string", "description": "Carousel title" }, + "title": { "type": "string", "maxLength": 2000, "description": "Carousel title" }, "items": { "type": "array", + "maxItems": 100, "description": "Carousel items (product cards or images)", "items": { "type": "object" } } @@ -118,8 +119,8 @@ "data": { "type": "object", "properties": { - "label": { "type": "string", "description": "Button label" }, - "action": { "type": "string", "description": "Action identifier (e.g., 'acp_checkout')" }, + "label": { "type": "string", "maxLength": 255, "description": "Button label" }, + "action": { "type": "string", "maxLength": 255, "description": "Action identifier (e.g., 'acp_checkout')" }, "payload": { "type": "object", "description": "Action payload" } }, "required": ["label", "action"] @@ -137,8 +138,8 @@ "additionalProperties": { "type": "object", "properties": { - "app_id": { "type": "string" }, - "deep_link": { "type": "string" }, + "app_id": { "type": "string", "maxLength": 255 }, + "deep_link": { "type": "string", "maxLength": 2048 }, "url": { "type": "string", "format": "uri" } } } @@ -155,6 +156,7 @@ "properties": { "actions": { "type": "array", + "maxItems": 100, "description": "Available integration actions", "items": { "type": "object", @@ -166,6 +168,7 @@ }, "label": { "type": "string", + "maxLength": 255, "description": "User-facing button label" }, "highlighted": { diff --git a/static/schemas/source/trust/v1/trust-acknowledgements.json b/static/schemas/source/trust/v1/trust-acknowledgements.json index 5d2e388bc04..e2e43710945 100644 --- a/static/schemas/source/trust/v1/trust-acknowledgements.json +++ b/static/schemas/source/trust/v1/trust-acknowledgements.json @@ -8,7 +8,8 @@ "type": "object", "properties": { "$schema": { - "type": "string" + "type": "string", + "maxLength": 2048 }, "last_updated": { "type": "string", @@ -16,6 +17,7 @@ }, "acknowledgements": { "type": "array", + "maxItems": 10000, "items": { "$ref": "/schemas/trust/v1/trust.json#/definitions/acknowledgement" } diff --git a/static/schemas/source/trust/v1/trust.json b/static/schemas/source/trust/v1/trust.json index edd53a17f59..9e7fc45e3f1 100644 --- a/static/schemas/source/trust/v1/trust.json +++ b/static/schemas/source/trust/v1/trust.json @@ -8,6 +8,7 @@ "definitions": { "domain": { "type": "string", + "maxLength": 253, "pattern": "^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z]{2,63}$", "description": "A lowercase DNS host name (internationalized names in punycode)." }, @@ -19,6 +20,7 @@ }, "namespaced_token": { "type": "string", + "maxLength": 4096, "pattern": "^[a-z0-9-]+:[a-z0-9_.-]+$", "description": "A ':' token. Each namespace is defined by the protocol that owns it (e.g. 'adcp:' by AdCP). Consumers MUST ignore tokens in namespaces they do not implement." }, @@ -130,6 +132,7 @@ }, "roles": { "type": "array", + "maxItems": 100, "description": "What this agent does, as namespaced roles.", "items": { "$ref": "#/definitions/role" @@ -139,6 +142,7 @@ }, "protocols": { "type": "array", + "maxItems": 32, "description": "Transport protocols the endpoint speaks. Informational.", "items": { "type": "string", @@ -151,13 +155,16 @@ }, "id": { "type": "string", + "maxLength": 255, "description": "Operator-chosen identifier for logging and routing. Not an identity input." }, "description": { - "type": "string" + "type": "string", + "maxLength": 2000 }, "countries": { "type": "array", + "maxItems": 256, "description": "ISO 3166-1 alpha-2 country codes where this agent operates. Omit for global.", "items": { "type": "string", @@ -177,6 +184,7 @@ "properties": { "available_uses": { "type": "array", + "maxItems": 32, "items": { "$ref": "/schemas/enums/right-use.json" }, @@ -184,6 +192,7 @@ }, "right_types": { "type": "array", + "maxItems": 32, "items": { "$ref": "/schemas/enums/right-type.json" }, @@ -235,6 +244,7 @@ }, "agents": { "type": "array", + "maxItems": 100, "description": "Optional narrowing to specific agents the grantee runs. When absent, any agent that resolves to the grantee acts under the grant.", "items": { "$ref": "#/definitions/granted_agent" @@ -243,6 +253,7 @@ }, "scopes": { "type": "array", + "maxItems": 32, "items": { "$ref": "#/definitions/scope" }, @@ -251,6 +262,7 @@ }, "countries": { "type": "array", + "maxItems": 256, "description": "ISO 3166-1 alpha-2 country codes where the grant applies. Omit for global.", "items": { "type": "string", @@ -280,9 +292,11 @@ "properties": { "brands": { "type": "array", + "maxItems": 100, "description": "Brand IDs from this organization's brand.json that the grant covers. ['*'] or omitted means every brand the grantor owns. On a grantee's own grant to an intermediary, the IDs are those of the brands in the grant it received.", "items": { "type": "string", + "maxLength": 255, "pattern": "^([a-z0-9_]+|\\*)$" }, "minItems": 1 @@ -373,6 +387,7 @@ "properties": { "identity_relying_parties": { "type": "array", + "maxItems": 100, "description": "Verified-identity relying parties this organization operates (TMP Identity Match attestation provenance). Intended to move here from brand.json in a future release; brand.json is unchanged in 3.3. Experimental.", "items": { "$ref": "/schemas/core/identity-relying-party.json" @@ -398,7 +413,8 @@ "description": "Pointer for hosted records (a managed network, a platform, AAO hosting). The organization is still the host that served this pointer. Verifiers follow at most one hop, with zero HTTP redirects, and MUST NOT follow a second pointer. Hosts serving records on an organization's behalf MUST only serve records the organization controls.", "properties": { "$schema": { - "type": "string" + "type": "string", + "maxLength": 2048 }, "authoritative_location": { "$ref": "#/definitions/https_url", @@ -419,10 +435,12 @@ "title": "Trust Record", "properties": { "$schema": { - "type": "string" + "type": "string", + "maxLength": 2048 }, "version": { - "type": "string" + "type": "string", + "maxLength": 64 }, "last_updated": { "type": "string", @@ -430,6 +448,7 @@ }, "agents": { "type": "array", + "maxItems": 100, "description": "Agents this organization runs.", "items": { "$ref": "#/definitions/agent" @@ -437,6 +456,7 @@ }, "grants": { "type": "array", + "maxItems": 500, "description": "Authority this organization delegates to others.", "items": { "$ref": "#/definitions/grant" @@ -449,6 +469,7 @@ }, "acknowledgements": { "type": "array", + "maxItems": 500, "description": "Inline acknowledgements. Mutually exclusive with acknowledgements_url. Organizations acknowledging more than a few hundred grants SHOULD use acknowledgements_url so the key-resolution fetch stays small.", "items": { "$ref": "#/definitions/acknowledgement" diff --git a/static/schemas/source/trusted-match/available-package.json b/static/schemas/source/trusted-match/available-package.json index 2c78e1e6cdd..b258c79a9f5 100644 --- a/static/schemas/source/trusted-match/available-package.json +++ b/static/schemas/source/trusted-match/available-package.json @@ -8,10 +8,12 @@ "properties": { "package_id": { "type": "string", + "maxLength": 255, "description": "Unique identifier for the package" }, "media_buy_id": { "type": "string", + "maxLength": 255, "description": "Media buy that this package belongs to" }, "seller_agent": { @@ -20,6 +22,7 @@ }, "format_ids": { "type": "array", + "maxItems": 1000, "deprecated": true, "x-removed-in": "4.0.0", "description": "Deprecated in AdCP 3.2; removed in AdCP 4.0. Legacy named-format identifiers eligible for this package. Use canonical `format_options`.", @@ -29,6 +32,7 @@ }, "format_options": { "type": "array", + "maxItems": 100, "description": "Immutable seller-resolved PackageFormatSnapshots eligible for this package. A sender projects this field only when the Trusted Match transport profile supports the highest AdCP release version of every field in every snapshot. It MUST NOT strip an unsupported selector or digest field from a snapshot; for an older or version-unknown provider, omit the entire contract-bearing snapshot and do not claim production-path evidence from a legacy projection.", "items": { "$ref": "/schemas/core/package-format-snapshot.json" }, "minItems": 1, @@ -41,6 +45,7 @@ }, "catalogs": { "type": "array", + "maxItems": 100, "description": "The buyer's catalogs attached to this package, with selectors (ids, gtins, tags, category, query) scoping which items are in play. References synced catalogs by catalog_id. The provider resolves items from its cached copy.", "items": { "$ref": "/schemas/core/catalog.json" diff --git a/static/schemas/source/trusted-match/context-match-request.json b/static/schemas/source/trusted-match/context-match-request.json index 8a33d9efd05..ea528ec5df7 100644 --- a/static/schemas/source/trusted-match/context-match-request.json +++ b/static/schemas/source/trusted-match/context-match-request.json @@ -13,6 +13,7 @@ }, "adcp_version": { "type": "string", + "maxLength": 64, "description": "Release-precision AdCP version (VERSION.RELEASE, e.g. \"3.0\", \"3.1\", \"3.1-beta\"). On a request: the buyer's release pin. Inlined here (rather than via core/version-envelope.json allOf) so this schema can keep `additionalProperties: false` — the privacy boundary on this endpoint is contract-bearing.", "pattern": "^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$" }, @@ -31,11 +32,13 @@ }, "protocol_version": { "type": "string", + "maxLength": 64, "description": "TMP protocol version. Allows receivers to handle semantic differences across versions.", "default": "1.0" }, "request_id": { "type": "string", + "maxLength": 255, "description": "Unique request identifier. MUST NOT correlate with any identity match request_id." }, "property_rid": { @@ -53,6 +56,7 @@ }, "placement_id": { "type": "string", + "maxLength": 255, "description": "Placement identifier from the publisher's placement registry in adagents.json. Identifies where on the property this ad opportunity exists. One placement per request." }, "seller_agent_url": { @@ -87,6 +91,7 @@ }, "value": { "type": "string", + "maxLength": 255, "description": "The identifier value. For 'url': the canonical content URL — MUST NOT contain user-specific path segments, query parameters, or fragments; use 'url_hash' when the publisher prefers not to reveal the URL. For 'url_hash': Blake3 hash of the canonicalized URL, base64-encoded (canonicalization: strip scheme, strip www./m./amp. prefixes, lowercase, strip trailing slash, strip query params and fragments). For 'eidr': the EIDR DOI (e.g., '10.5240/xxxx'). For 'gracenote': the Gracenote TMS ID (e.g., 'SH032541890000'). For 'isrc': the ISRC code (e.g., 'USRC17607839'). For 'gtin': the GTIN (e.g., '00012345678905'). For 'rss_guid': the episode GUID from the RSS feed. For 'isbn': the ISBN (e.g., '978-0-123456-78-9'). For 'custom': a publisher-defined identifier." } }, @@ -123,6 +128,7 @@ }, "value": { "type": "string", + "maxLength": 255, "description": "Metro code within the system (e.g., '501' for New York DMA)." } }, @@ -143,12 +149,14 @@ "type": "array", "description": "Content topic identifiers. Use IAB Content Taxonomy 3.0 IDs (e.g., '632' for Food & Drink) when taxonomy_id is 7, or bounded human-readable category labels (e.g., 'cooking.pasta') for custom taxonomies. For non-public content attributable to a single user or session, publishers MUST use standardized taxonomy identifiers or bounded custom category labels; custom topic strings MUST NOT reproduce distinctive verbatim phrasing and MUST NOT include PII or uniquely identifying details.", "items": { - "type": "string" + "type": "string", + "maxLength": 500 }, "maxItems": 50 }, "taxonomy_source": { "type": "string", + "maxLength": 255, "description": "Organization that defines the topic taxonomy. Use 'iab' for IAB Content Taxonomy. Publishers may use other values for custom taxonomies.", "default": "iab" }, @@ -185,7 +193,8 @@ "type": "array", "description": "Policy IDs from the AdCP policy registry that this content satisfies (e.g., 'csbs' for Common Sense Brand Standards). Buyers filter on policies they require. An empty array means no policies have been evaluated.", "items": { - "type": "string" + "type": "string", + "maxLength": 2000 }, "maxItems": 20 }, @@ -196,10 +205,12 @@ }, "embedding": { "type": "string", + "maxLength": 65536, "description": "Content embedding as base64-encoded int8 vector. Captures semantic content beyond what topics and keywords express. MUST NOT be computed directly or indirectly from non-public content authored by or attributable to a single user or session, including conversation turns, prompts, and individual search queries. MAY represent public content or a shared content environment that is not attributable to one user's activity. Publishers declare the model used. For standardized matching, use the protocol-recommended model (nomic-embed-text-v1.5, 256 dims, int8 quantized = 256 bytes)." }, "embedding_model": { "type": "string", + "maxLength": 500, "description": "Embedding model identifier (e.g., 'nomic-embed-text-v1.5'). Required when embedding is present." }, "embedding_dims": { @@ -215,7 +226,8 @@ "type": "array", "description": "Restrict evaluation to specific packages. When omitted, the provider evaluates all eligible packages for this placement (the common case). MUST NOT vary by user — the same package_ids must be sent for every user on a given placement. User-dependent filtering leaks identity into the context path.", "items": { - "type": "string" + "type": "string", + "maxLength": 255 }, "minItems": 1, "maxItems": 500 diff --git a/static/schemas/source/trusted-match/context-match-response.json b/static/schemas/source/trusted-match/context-match-response.json index 6175420ea55..6f63d0f1879 100644 --- a/static/schemas/source/trusted-match/context-match-response.json +++ b/static/schemas/source/trusted-match/context-match-response.json @@ -13,16 +13,19 @@ "definitions": { "targeting_kvs": { "type": "array", + "maxItems": 100, "description": "Provider-local key-value pairs for ad-server targeting. The router preserves each pair unchanged and attributes it by provider_id; the publisher maps the tuple (provider_id, key) to a local ad-server destination.", "items": { "type": "object", "properties": { "key": { "type": "string", + "maxLength": 255, "description": "Provider-local targeting key. Publishers resolve this together with provider_id; it is not a globally unique or publisher-owned ad-server key." }, "value": { "type": "string", + "maxLength": 255, "description": "Targeting value preserved unchanged by the router." } }, @@ -42,10 +45,12 @@ }, "request_id": { "type": "string", + "maxLength": 255, "description": "Echoed request identifier from the context match request." }, "offers": { "type": "array", + "maxItems": 100, "description": "Offers collected across the provider fan-out, one per activated package. An empty array means no packages matched. For simple activation, each offer has just package_id. For richer responses, offers include brand, price, summary, and creative manifest.", "items": { "$ref": "/schemas/trusted-match/offer.json" @@ -57,9 +62,11 @@ "properties": { "segments": { "type": "array", + "maxItems": 100, "description": "Contextual segment identifiers combined across provider responses.", "items": { - "type": "string" + "type": "string", + "maxLength": 255 } } }, diff --git a/static/schemas/source/trusted-match/error.json b/static/schemas/source/trusted-match/error.json index f3c7d9e6173..702fdd0d5ed 100644 --- a/static/schemas/source/trusted-match/error.json +++ b/static/schemas/source/trusted-match/error.json @@ -13,6 +13,7 @@ }, "request_id": { "type": "string", + "maxLength": 255, "description": "Echoed request identifier from the original request" }, "code": { @@ -30,6 +31,7 @@ }, "message": { "type": "string", + "maxLength": 2000, "description": "Human-readable error description for debugging" } }, diff --git a/static/schemas/source/trusted-match/identity-match-request.json b/static/schemas/source/trusted-match/identity-match-request.json index 2f1503b1d7e..60f8eed58bb 100644 --- a/static/schemas/source/trusted-match/identity-match-request.json +++ b/static/schemas/source/trusted-match/identity-match-request.json @@ -13,6 +13,7 @@ }, "adcp_version": { "type": "string", + "maxLength": 64, "description": "Release-precision AdCP version (VERSION.RELEASE, e.g. \"3.0\", \"3.1\", \"3.1-beta\"). On a request: the buyer's release pin. Inlined here (rather than via core/version-envelope.json allOf) so this schema can keep `additionalProperties: false` — the privacy boundary on this endpoint is contract-bearing.", "pattern": "^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$" }, @@ -31,11 +32,13 @@ }, "protocol_version": { "type": "string", + "maxLength": 64, "description": "TMP protocol version. Allows receivers to handle semantic differences across versions.", "default": "1.0" }, "request_id": { "type": "string", + "maxLength": 255, "description": "Unique request identifier. MUST NOT correlate with any context match request_id." }, "seller_agent_url": { @@ -51,6 +54,7 @@ "properties": { "user_token": { "type": "string", + "maxLength": 4096, "description": "Opaque token from an identity provider (ID5, LiveRamp, UID2) or publisher-generated. Buyer may map to internal identity graph but cannot reverse to PII." }, "uid_type": { @@ -67,15 +71,18 @@ }, "scheme": { "type": "string", + "maxLength": 500, "description": "Proof scheme and version, e.g. \"world_id_v4\". Selects how `proof` is verified." }, "relying_party_id": { "type": "string", + "maxLength": 255, "x-entity": "identity_relying_party", "description": "Relying-party id the proof was minted for. The receiver checks this against the relying_party_id's published owner (brand.json `identity_relying_parties[]`) so a forwarded proof cannot be replayed under a different owner." }, "action": { "type": "string", + "maxLength": 255, "description": "Issuer action/scope the proof was bound to (e.g. \"humanity-check-for-ads\")." }, "claims": { @@ -99,6 +106,7 @@ }, "signal_binding": { "type": "string", + "maxLength": 255, "description": "Hash of the signal the proof commits to. The receiver MUST verify it matches the context the receiver expects (e.g. a buyer-issued nonce or the request_id) and that the attestation is within its freshness window; this, plus nullifier-reuse tracking, is the replay defense." }, "proof": { @@ -140,14 +148,17 @@ }, "tcf_consent": { "type": "string", + "maxLength": 4096, "description": "IAB TCF v2.2 consent string. Present when gdpr is true." }, "gpp": { "type": "string", + "maxLength": 4096, "description": "IAB Global Privacy Platform string." }, "us_privacy": { "type": "string", + "maxLength": 16, "deprecated": true, "description": "US Privacy string (CCPA). Deprecated in favor of GPP but still widely used." } @@ -156,9 +167,11 @@ }, "package_ids": { "type": "array", + "maxItems": 500, "description": "Optional. When omitted, the buyer evaluates eligibility against the full set of active packages it has registered for `seller_agent_url`. When provided, the composition of `package_ids` MUST be statistically independent of the current placement — sending only the page-specific subset would let the buyer correlate Identity Match with Context Match by comparing package sets. Two acceptable modes: (a) **all-active** — include every active package this buyer has at this publisher; (b) **fuzzed** — include a random sample of active packages, optionally padded with synthetic non-existent IDs, drawn from a distribution that does not depend on the current placement. The buyer's silent-drop behavior on unknown IDs (specified below) is what makes synthetic-ID padding safe — they do not affect the response shape and cannot leak registry membership. When both `seller_agent_url` and `package_ids` are present, the buyer evaluates against the intersection of its registered active set and `package_ids`; IDs in `package_ids` that the buyer has not registered for this seller MUST be silently ignored (not surfaced as errors) to avoid leaking registry membership back to the publisher.", "items": { - "type": "string" + "type": "string", + "maxLength": 255 }, "minItems": 1 }, diff --git a/static/schemas/source/trusted-match/identity-match-response.json b/static/schemas/source/trusted-match/identity-match-response.json index 9ec4568b535..0d258ab2f0c 100644 --- a/static/schemas/source/trusted-match/identity-match-response.json +++ b/static/schemas/source/trusted-match/identity-match-response.json @@ -18,13 +18,16 @@ }, "request_id": { "type": "string", + "maxLength": 255, "description": "Echoed request identifier from the identity match request" }, "eligible_package_ids": { "type": "array", + "maxItems": 1000, "description": "Package IDs the user is eligible for. Packages not listed are ineligible.", "items": { - "type": "string" + "type": "string", + "maxLength": 255 } }, "serve_window_sec": { @@ -35,6 +38,7 @@ }, "tmpx": { "type": "string", + "maxLength": 4096, "deprecated": true, "x-removed-in": "4.0.0", "description": "DEPRECATED in favor of tmpx_providers. Routers MAY continue to populate this field for back-compat with consumers that only know the single-token shape; when both fields are present, tmpx_providers is authoritative. Single HPKE-encrypted exposure token containing the resolved user identity tokens. Wire format: kid.base64url_nopad(ciphertext) — unpadded base64url per RFC 4648 section 5 (no = characters). Publishers MUST treat this value as opaque pass-through data. Removed in 4.0." diff --git a/static/schemas/source/trusted-match/offer.json b/static/schemas/source/trusted-match/offer.json index 855b3f465e6..771dcc83908 100644 --- a/static/schemas/source/trusted-match/offer.json +++ b/static/schemas/source/trusted-match/offer.json @@ -8,6 +8,7 @@ "properties": { "package_id": { "type": "string", + "maxLength": 255, "description": "Package identifier from the media buy." }, "seller_agent": { @@ -24,6 +25,7 @@ }, "summary": { "type": "string", + "maxLength": 2000, "description": "Buyer-generated description of the offer, for the publisher to judge relevance. E.g., '50% off Goldenfield mayo — recipe integration'. The publisher (or their AI assistant) uses this to decide whether the offer fits the context." }, "creative_manifest": { @@ -34,7 +36,8 @@ "type": "object", "description": "Optional free-form string enhancements for dynamic creative rendering, such as sponsor labels and promotion codes. The map has no protocol-level key registry or required keys: meanings are package-local, receivers MUST ignore unknown keys, and a missing key MUST NOT make an otherwise renderable offer fail. Required renderable content belongs in creative_manifest assets, so creative_data may complement but never replace a manifest's required assets. This is not ad-server macro substitution or attribution tracking; tracker URLs belong in creative_manifest assets and per-user exposure tracking uses TMPX.", "additionalProperties": { - "type": "string" + "type": "string", + "maxLength": 1048576 } } }, diff --git a/static/schemas/source/trusted-match/provider-context-match-response.json b/static/schemas/source/trusted-match/provider-context-match-response.json index 9d92ba3ad81..73bc9e21f46 100644 --- a/static/schemas/source/trusted-match/provider-context-match-response.json +++ b/static/schemas/source/trusted-match/provider-context-match-response.json @@ -13,16 +13,19 @@ "definitions": { "targeting_kvs": { "type": "array", + "maxItems": 100, "description": "Provider-local key-value pairs for ad-server targeting. The router preserves each pair unchanged under the emitting provider's registered provider_id.", "items": { "type": "object", "properties": { "key": { "type": "string", + "maxLength": 255, "description": "Provider-local targeting key. It is not a globally unique or publisher-owned ad-server destination." }, "value": { "type": "string", + "maxLength": 255, "description": "Targeting value that the router preserves unchanged." } }, @@ -42,10 +45,12 @@ }, "request_id": { "type": "string", + "maxLength": 255, "description": "Echoed request identifier from the context match request." }, "offers": { "type": "array", + "maxItems": 100, "description": "Offers from this provider, one per activated package. An empty array means no packages matched. For simple activation, each offer has just package_id. For richer responses, offers include brand, price, summary, and creative manifest.", "items": { "$ref": "/schemas/trusted-match/offer.json" @@ -63,9 +68,11 @@ "properties": { "segments": { "type": "array", + "maxItems": 100, "description": "Contextual segment identifiers.", "items": { - "type": "string" + "type": "string", + "maxLength": 255 } }, "targeting_kvs": { diff --git a/static/schemas/source/trusted-match/provider-identity-match-response.json b/static/schemas/source/trusted-match/provider-identity-match-response.json index 71cda142e17..74a6530c70c 100644 --- a/static/schemas/source/trusted-match/provider-identity-match-response.json +++ b/static/schemas/source/trusted-match/provider-identity-match-response.json @@ -18,13 +18,16 @@ }, "request_id": { "type": "string", + "maxLength": 255, "description": "Echoed request identifier from the identity match request." }, "eligible_package_ids": { "type": "array", + "maxItems": 1000, "description": "Package IDs the user is eligible for. Packages not listed are ineligible.", "items": { - "type": "string" + "type": "string", + "maxLength": 255 } }, "serve_window_sec": { diff --git a/static/schemas/source/trusted-match/provider-registration.json b/static/schemas/source/trusted-match/provider-registration.json index 0e28452f28b..41b8505d41a 100644 --- a/static/schemas/source/trusted-match/provider-registration.json +++ b/static/schemas/source/trusted-match/provider-registration.json @@ -28,6 +28,7 @@ }, "countries": { "type": "array", + "maxItems": 256, "description": "ISO 3166-1 alpha-2 country codes this provider serves. The router filters Identity Match providers by the request's country field. MUST be present and non-empty when identity_match is true.", "items": { "type": "string", @@ -37,6 +38,7 @@ }, "uid_types": { "type": "array", + "maxItems": 32, "description": "Identity types this provider can resolve. The router selects Identity Match providers whose uid_types overlaps with any uid_type in the request's identities array. MUST be present and non-empty when identity_match is true.", "items": { "$ref": "/schemas/enums/uid-type.json" @@ -45,6 +47,7 @@ }, "match_keys": { "type": "array", + "maxItems": 64, "x-added-in": "3.3.0", "description": "The same keys as uid_types in the match-key shape, adding the scopes and vendor each resolves at. Uses the shape of Product.identity.match_keys so the serve-time declaration and the buy-time declaration are compared with one rule. Every uid_type here MUST appear in uid_types, which remains the routing and filtering input. uses is always [\"identity_match\"].", "items": { diff --git a/tests/audit-schema-bounds.test.cjs b/tests/audit-schema-bounds.test.cjs new file mode 100644 index 00000000000..2c1bb0059d2 --- /dev/null +++ b/tests/audit-schema-bounds.test.cjs @@ -0,0 +1,394 @@ +/** + * Unit tests for scripts/audit-schema-bounds.cjs on small fixture trees: how it + * classifies side, stability and inline property lists, and what it skips. + * The live schema tree is checked only for ref resolution. + */ +const test = require('node:test'); +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const os = require('node:os'); +const path = require('node:path'); +const { build, apply, isBoundedPattern } = require('../scripts/audit-schema-bounds.cjs'); + +function writeTree(root, files) { + for (const [rel, doc] of Object.entries(files)) { + const full = path.join(root, rel); + fs.mkdirSync(path.dirname(full), { recursive: true }); + fs.writeFileSync(full, typeof doc === 'string' ? doc : JSON.stringify(doc)); + } +} + +function fixture(source, released = {}) { + const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'bounds-audit-')); + const sourceDir = path.join(dir, 'source'); + const distDir = path.join(dir, 'dist'); + writeTree(sourceDir, source); + writeTree(path.join(distDir, '3.2.7'), released); + return { dir, sourceDir, distDir }; +} + +const find = (inventory, file, pointer) => inventory.entries.find(e => e.file === file && e.pointer === pointer); + +test('a bounded pattern is anchored and has no unbounded quantifier', () => { + assert.equal(isBoundedPattern('^[a-z]{1,64}$'), true); + assert.equal(isBoundedPattern('^\\d{4}-\\d{2}$'), true); + assert.equal(isBoundedPattern('^[a-z0-9_]+$'), false); + assert.equal(isBoundedPattern('^[a-z]{1,}$'), false); + assert.equal(isBoundedPattern('^https://'), false); + assert.equal(isBoundedPattern('^a.*b$'), false); +}); + +test('arrays and strings are listed unless bounded or constrained', () => { + const { dir, sourceDir, distDir } = fixture({ + 'core/thing.json': { + $id: '/schemas/core/thing.json', + type: 'object', + properties: { + open_array: { type: 'array', items: { type: 'string' } }, + bounded_array: { type: 'array', maxItems: 5, items: { type: 'string', maxLength: 8 } }, + plain: { type: 'string' }, + bounded: { type: 'string', maxLength: 10 }, + enumerated: { type: 'string', enum: ['a', 'b'] }, + constant: { type: 'string', const: 'x' }, + stamp: { type: 'string', format: 'date-time' }, + link: { type: 'string', format: 'uri' }, + short: { type: 'string', pattern: '^[a-z]{1,8}$' }, + long: { type: 'string', pattern: '^[a-z]+$' }, + }, + }, + }); + const inventory = build({ sourceDir, distDir }); + const pointers = inventory.entries.map(e => e.pointer).sort(); + assert.deepEqual(pointers, ['/properties/long', '/properties/open_array', '/properties/open_array/items', '/properties/plain']); + assert.equal(inventory.meta.unbounded_uri_strings, 1, 'uri strings are skipped but counted'); + fs.rmSync(dir, { recursive: true, force: true }); +}); + +test('side follows $ref from task requests and responses', () => { + const { dir, sourceDir, distDir } = fixture({ + 'core/shared.json': { $id: '/schemas/core/shared.json', type: 'object', properties: { note: { type: 'string' } } }, + 'core/request-only.json': { $id: '/schemas/core/request-only.json', type: 'object', properties: { memo: { type: 'string' } } }, + 'core/orphan.json': { $id: '/schemas/core/orphan.json', type: 'object', properties: { aside: { type: 'string' } } }, + 'media-buy/do-thing-request.json': { + $id: '/schemas/media-buy/do-thing-request.json', + type: 'object', + properties: { shared: { $ref: '/schemas/core/shared.json' }, only: { $ref: '/schemas/core/request-only.json' } }, + }, + 'media-buy/do-thing-response.json': { + $id: '/schemas/media-buy/do-thing-response.json', + type: 'object', + properties: { shared: { $ref: '/schemas/core/shared.json' } }, + }, + }); + const inventory = build({ sourceDir, distDir }); + assert.equal(find(inventory, 'core/shared.json', '/properties/note').side, 'both'); + assert.equal(find(inventory, 'core/request-only.json', '/properties/memo').side, 'request'); + assert.equal(find(inventory, 'core/orphan.json', '/properties/aside').side, 'other'); + fs.rmSync(dir, { recursive: true, force: true }); +}); + +test('stability needs the marker and absence from the last stable release', () => { + const released = { + 'core/thing.json': { + $id: '/schemas/core/thing.json', + type: 'object', + properties: { kept: { type: 'string' }, mislabelled: { type: 'string' } }, + }, + }; + const { dir, sourceDir, distDir } = fixture( + { + 'core/thing.json': { + $id: '/schemas/core/thing.json', + type: 'object', + properties: { + kept: { type: 'string' }, + fresh: { type: 'string', 'x-added-in': '3.3.0' }, + unmarked: { type: 'string' }, + mislabelled: { type: 'string', 'x-added-in': '3.3.0' }, + trial: { type: 'string', 'x-status': 'experimental' }, + nested: { type: 'object', 'x-added-in': '3.3.0', properties: { inner: { type: 'array', items: { type: 'object' } } } }, + }, + }, + }, + released + ); + const inventory = build({ sourceDir, distDir }); + const at = p => find(inventory, 'core/thing.json', p); + assert.equal(at('/properties/kept').stability, 'stable'); + assert.equal(at('/properties/fresh').stability, 'new-3.3'); + assert.equal(at('/properties/fresh').action, 'apply in 3.3'); + assert.equal(at('/properties/unmarked').stability, 'stable', 'absence from a release alone never promotes a node'); + assert.equal(at('/properties/mislabelled').stability, 'stable', 'a marker that conflicts with the release is stable'); + assert.equal(at('/properties/mislabelled').marker_conflict, true); + assert.equal(at('/properties/trial').stability, 'experimental'); + assert.equal(at('/properties/nested/properties/inner').stability, 'new-3.3', 'the marker covers descendants'); + fs.rmSync(dir, { recursive: true, force: true }); +}); + +test('a field that moved into a new file is still released', () => { + const released = { + 'brand.json': { + $id: '/schemas/brand.json', + type: 'object', + properties: { party: { type: 'object', properties: { party_id: { type: 'string' } } } }, + }, + 'media-buy/do-thing-request.json': { + $id: '/schemas/media-buy/do-thing-request.json', + type: 'object', + properties: { brand: { $ref: '/schemas/brand.json' } }, + }, + }; + const { dir, sourceDir, distDir } = fixture( + { + 'brand.json': { + $id: '/schemas/brand.json', + type: 'object', + properties: { party: { $ref: '/schemas/core/party.json' } }, + }, + 'core/party.json': { + $id: '/schemas/core/party.json', + 'x-added-in': '3.3.0', + type: 'object', + properties: { party_id: { type: 'string' }, brand_new: { type: 'string' } }, + }, + 'media-buy/do-thing-request.json': { + $id: '/schemas/media-buy/do-thing-request.json', + type: 'object', + properties: { brand: { $ref: '/schemas/brand.json' } }, + }, + }, + released + ); + const inventory = build({ sourceDir, distDir }); + assert.equal(find(inventory, 'core/party.json', '/properties/party_id').stability, 'stable', 'the file is new but the field shipped in 3.2.7 under brand.json'); + assert.equal(find(inventory, 'core/party.json', '/properties/brand_new').stability, 'new-3.3', 'a field 3.2.7 never carried stays new'); + fs.rmSync(dir, { recursive: true, force: true }); +}); + +test('a bound on a mixed-type node is deferred because SDK generation breaks on it', () => { + const { dir, sourceDir, distDir } = fixture({ + 'core/thing.json': { + $id: '/schemas/core/thing.json', + type: 'object', + properties: { + revision: { type: ['integer', 'string'], 'x-added-in': '3.3.0' }, + nullable_name: { type: ['string', 'null'], 'x-added-in': '3.3.0' }, + }, + }, + }); + const inventory = build({ sourceDir, distDir }); + assert.equal(find(inventory, 'core/thing.json', '/properties/revision').action, 'deferred (SDK generation)'); + assert.equal(find(inventory, 'core/thing.json', '/properties/nullable_name').action, 'apply in 3.3', 'nullable alone is fine'); + fs.rmSync(dir, { recursive: true, force: true }); +}); + +test('property and collection lists carried inline are flagged and get no limit', () => { + const { dir, sourceDir, distDir } = fixture({ + 'core/selector.json': { + $id: '/schemas/core/selector.json', + type: 'object', + properties: { + publisher_domains: { type: 'array', items: { type: 'string' } }, + property_list: { type: 'object', properties: { agent_url: { type: 'string', format: 'uri' }, list_id: { type: 'string', maxLength: 255 } } }, + collections: { type: 'array', items: { type: 'object' } }, + tags: { type: 'array', items: { type: 'string' } }, + }, + }, + }); + const inventory = build({ sourceDir, distDir }); + const listed = inventory.inline_property_lists.map(e => `${e.list_kind}:${e.pointer}`).sort(); + assert.deepEqual(listed, ['collection:/properties/collections', 'property:/properties/publisher_domains']); + const domains = find(inventory, 'core/selector.json', '/properties/publisher_domains'); + assert.equal(domains.proposed_limit, null); + assert.equal(domains.action, 'move out of band (4.0)'); + assert.equal(find(inventory, 'core/selector.json', '/properties/tags').action, 'tighten in 4.0'); + fs.rmSync(dir, { recursive: true, force: true }); +}); + +const tmpPaths = dir => ({ slicePath: path.join(dir, 'slice.json'), inventoryPath: path.join(dir, 'inventory.json') }); + +const THING_ID = '"$id": "/schemas/core/thing.json"'; + +test('apply inserts each bound right after type and keeps the file formatting', () => { + const before = `{ + ${THING_ID}, + "type": "object", + "properties": { + "tags": { + "type": "array", + "x-added-in": "3.3.0", + "items": { "type": "string", "maxLength": 10 } + }, + "keywords": { + "x-added-in": "3.3.0", + "items": { "type": "string", "maxLength": 10 }, + "type": "array" + }, + "note": { "type": "string", "minLength": 1, "x-added-in": "3.3.0" }, + "name": { + "type": "string", + "x-status": "experimental" + } + } +} +`; + const after = `{ + ${THING_ID}, + "type": "object", + "properties": { + "tags": { + "type": "array", + "maxItems": 32, + "x-added-in": "3.3.0", + "items": { "type": "string", "maxLength": 10 } + }, + "keywords": { + "x-added-in": "3.3.0", + "items": { "type": "string", "maxLength": 10 }, + "type": "array", + "maxItems": 32 + }, + "note": { "type": "string", "maxLength": 2000, "minLength": 1, "x-added-in": "3.3.0" }, + "name": { + "type": "string", + "maxLength": 255, + "x-status": "experimental" + } + } +} +`; + const { dir, sourceDir, distDir } = fixture({ 'core/thing.json': before }); + const result = apply({ sourceDir, distDir, ...tmpPaths(dir) }); + assert.equal(result.applied.length, 4); + assert.equal(fs.readFileSync(path.join(sourceDir, 'core/thing.json'), 'utf8'), after); + fs.rmSync(dir, { recursive: true, force: true }); +}); + +test('apply records what it added, rewrites the inventory and is idempotent', () => { + const text = `{ + ${THING_ID}, + "type": "object", + "properties": { + "tags": { "type": "array", "x-added-in": "3.3.0", "items": { "type": "string", "maxLength": 10 } }, + "note": { "type": "string", "x-status": "experimental" }, + "plain": { "type": "string" } + } +} +`; + const { dir, sourceDir, distDir } = fixture({ 'core/thing.json': text }); + const paths = tmpPaths(dir); + const first = apply({ sourceDir, distDir, ...paths }); + const expected = [ + { file: 'core/thing.json', pointer: '/properties/note', keyword: 'maxLength', limit: 2000, stability: 'experimental', tier: 'string-text' }, + { file: 'core/thing.json', pointer: '/properties/tags', keyword: 'maxItems', limit: 32, stability: 'new-3.3', tier: 'array-small' }, + ]; + assert.deepEqual([...first.applied].sort((a, b) => (a.pointer < b.pointer ? -1 : 1)), expected); + const slice = JSON.parse(fs.readFileSync(paths.slicePath, 'utf8')); + assert.equal(slice.count, 2); + assert.deepEqual(slice.applied, expected); + const inventory = JSON.parse(fs.readFileSync(paths.inventoryPath, 'utf8')); + assert.equal(inventory.entries.filter(e => e.action === 'apply in 3.3').length, 0); + assert.ok(inventory.entries.some(e => e.pointer === '/properties/plain' && e.action === 'tighten in 4.0')); + + const read = () => [path.join(sourceDir, 'core/thing.json'), paths.slicePath, paths.inventoryPath].map(f => fs.readFileSync(f, 'utf8')); + const snapshot = read(); + const second = apply({ sourceDir, distDir, ...paths }); + assert.equal(second.applied.length, 0); + assert.deepEqual(read(), snapshot); + fs.rmSync(dir, { recursive: true, force: true }); +}); + +test('the slice file keeps records whose bound is still in the source and drops the rest', () => { + const text = `{ + ${THING_ID}, + "type": "object", + "properties": { + "kept": { "type": "string", "maxLength": 255, "x-added-in": "3.3.0" }, + "fresh": { "type": "string", "x-added-in": "3.3.0" } + } +} +`; + const { dir, sourceDir, distDir } = fixture({ 'core/thing.json': text }); + const paths = tmpPaths(dir); + const record = (pointer, limit) => ({ file: 'core/thing.json', pointer, keyword: 'maxLength', limit, stability: 'new-3.3', tier: 'string-id' }); + fs.writeFileSync(paths.slicePath, JSON.stringify({ count: 2, applied: [record('/properties/kept', 255), record('/properties/gone', 255)] })); + const { applied, slice } = apply({ sourceDir, distDir, ...paths }); + assert.deepEqual(applied.map(r => r.pointer), ['/properties/fresh']); + assert.deepEqual(slice.map(r => r.pointer), ['/properties/fresh', '/properties/kept']); + const written = JSON.parse(fs.readFileSync(paths.slicePath, 'utf8')); + assert.equal(written.count, 2); + assert.deepEqual(written.applied.map(r => r.pointer), ['/properties/fresh', '/properties/kept']); + fs.rmSync(dir, { recursive: true, force: true }); +}); + +test('a field the #8501 withdrawal removes gets no bound', () => { + const doc = { + $id: '/schemas/core/sla-window.json', + type: 'object', + properties: { business_calendar_id: { type: 'string', 'x-added-in': '3.3.0' } }, + }; + const { dir, sourceDir, distDir } = fixture({ 'core/sla-window.json': doc }); + const inventory = build({ sourceDir, distDir }); + assert.equal(find(inventory, 'core/sla-window.json', '/properties/business_calendar_id').action, 'withdrawn (#8501)'); + const file = path.join(sourceDir, 'core/sla-window.json'); + const text = fs.readFileSync(file, 'utf8'); + const { applied } = apply({ sourceDir, distDir, ...tmpPaths(dir) }); + assert.equal(applied.length, 0); + assert.equal(fs.readFileSync(file, 'utf8'), text); + fs.rmSync(dir, { recursive: true, force: true }); +}); + +test('the last stable release is the highest 3.2.x', () => { + const thing = properties => ({ $id: '/schemas/core/thing.json', type: 'object', properties }); + const { dir, sourceDir, distDir } = fixture({ 'core/thing.json': thing({ fresh: { type: 'string', 'x-added-in': '3.3.0' } }) }); + writeTree(path.join(distDir, '3.1.9'), { 'core/thing.json': thing({}) }); + writeTree(path.join(distDir, '3.2.7'), { 'core/thing.json': thing({}) }); + writeTree(path.join(distDir, '3.2.8'), { 'core/thing.json': thing({ fresh: { type: 'string' } }) }); + writeTree(path.join(distDir, '3.3.0-beta.1'), { 'core/thing.json': thing({ fresh: { type: 'string' } }) }); + const inventory = build({ sourceDir, distDir }); + assert.equal(inventory.meta.last_stable_release, '3.2.8'); + const entry = find(inventory, 'core/thing.json', '/properties/fresh'); + assert.equal(entry.stability, 'stable'); + assert.equal(entry.marker_conflict, true); + fs.rmSync(dir, { recursive: true, force: true }); +}); + +test('an exclusion for a node that is gone is reported as stale', () => { + const key = 'core/sla-window.json#/properties/business_calendar_id'; + const absent = fixture({ 'core/thing.json': { $id: '/schemas/core/thing.json', type: 'object', properties: { a: { type: 'string' } } } }); + assert.ok(build({ sourceDir: absent.sourceDir, distDir: absent.distDir }).meta.stale_exclusions.includes(key)); + const present = fixture({ + 'core/sla-window.json': { $id: '/schemas/core/sla-window.json', type: 'object', properties: { business_calendar_id: { type: 'string', 'x-added-in': '3.3.0' } } }, + }); + assert.ok(!build({ sourceDir: present.sourceDir, distDir: present.distDir }).meta.stale_exclusions.includes(key)); + fs.rmSync(absent.dir, { recursive: true, force: true }); + fs.rmSync(present.dir, { recursive: true, force: true }); +}); + +test('the live schema tree resolves every $ref the audit follows', () => { + const inventory = build(); + assert.deepEqual(inventory.meta.unresolved_refs, []); + assert.ok(inventory.entries.length > 0); +}); + +test('no schema file carries a duplicate bound keyword', () => { + // A bound applied beside an existing one leaves two keys in one object, and JSON.parse + // silently keeps the last. Compare the keyword occurrences in the text with the ones the + // parser sees: a duplicate shows up as a difference. + const root = path.join(__dirname, '..', 'static', 'schemas', 'source'); + const walk = dir => fs.readdirSync(dir, { withFileTypes: true }).flatMap(e => (e.isDirectory() ? walk(path.join(dir, e.name)) : e.name.endsWith('.json') ? [path.join(dir, e.name)] : [])); + const duplicates = []; + for (const file of walk(root)) { + const text = fs.readFileSync(file, 'utf8'); + for (const keyword of ['maxItems', 'maxLength']) { + const inText = (text.match(new RegExp(`"${keyword}"\\s*:\\s*\\d`, 'g')) || []).length; + let parsed = 0; + JSON.parse(text, (key, value) => { + if (key === keyword && typeof value === 'number') parsed++; + return value; + }); + if (inText !== parsed) duplicates.push(`${path.relative(root, file)} ${keyword}`); + } + } + assert.deepEqual(duplicates, []); +}); diff --git a/tests/mcp-schema-projection.test.cjs b/tests/mcp-schema-projection.test.cjs index 07d6ff758ff..c0e68d138b1 100644 --- a/tests/mcp-schema-projection.test.cjs +++ b/tests/mcp-schema-projection.test.cjs @@ -201,7 +201,10 @@ const MODEL_CONTEXT_BUDGET_KIB = { // 1_376_000. // Experimental match keys (#8375) reach the seeded Product through // Product.identity.match_keys: 1_375_833 → 1_383_804 bytes. Bound at 1_384_000. -const PARITY_COMPILE_LIMIT = 1_384_000; +// The 3.3 bounds slice (#8512) adds maxItems/maxLength to the new and +// experimental fields in the controller closure: 1_383_804 -> 1_385_040 bytes +// measured against main, bound at 1_386_000. +const PARITY_COMPILE_LIMIT = 1_386_000; function readJson(filename) { return JSON.parse(fs.readFileSync(filename, 'utf8'));