Repository navigation
fix(creative): tracker-slot limits apply only where a format declares tracker slots - #8715
Conversation
…s tracker slots The assignment-tracker rules required every assignment tracker to occupy a declared tracker slot, but never said what happens when the format declares none, as canonical image does (its tracking model fires trackers through macros). Read strictly, every assignment tracker on standard display formats had to be rejected. - Tracker-slot limits apply only when the effective format declares at least one tracker slot (a pixel_tracker slot, or a canonical impression_tracker, click_tracker, or viewability_tracker slot). A format that declares none makes no slot-limit claim; the fire-or-reject rule still applies. - Trackers match slots by event: impression_tracker takes impression, click_tracker takes click, viewability_tracker takes viewable_* and audible_video_complete, any other pixel_tracker slot takes any event. - The same rules govern trackers a replace transfers. Closes #8713 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated paths touched without an approving review.
This PR modifies files under static/schemas/source/**, which are under a hard, deterministic approval gate (gated_paths: true), and review_decision is REVIEW_REQUIRED (not APPROVED). Per decision rule row 2, the outcome must be escalate until a human/CODEOWNERS approval satisfies the gate.
Substantively the change looks clean: an editorial/normative clarification of the 3.3 assignment-trackers rule (tracker-slot limits apply only where the effective format declares a tracker slot, plus event-to-slot matching). The rule text is consistent across all five surfaces (both sync-creatives-request.json description sites, creative-assignment.json, the capability flag in get-adcp-capabilities-response.json, and the two docs pages), schema↔docs coherence holds, no structural schema change (description text only — oneOf audit unaffected), and the minor changeset is correct for a non-breaking refinement of an unreleased 3.3 feature. The reviewer surfaced no Critical/High/Medium findings.
No blocking findings exist, so this is not request-changes — but the gated-paths rule forbids approval without review_decision: APPROVED.
Escalation reasons
- Modifies gated schema source files under
static/schemas/source/**(creative-assignment.json,sync-creatives-request.json,get-adcp-capabilities-response.json) whilereview_decisionisREVIEW_REQUIRED— human/CODEOWNERS review required to satisfy the hard approval gate.
Why human review
- Modifies gated paths under static/schemas/source/** (creative-assignment.json, sync-creatives-request.json, get-adcp-capabilities-response.json) while review_decision is REVIEW_REQUIRED — human/CODEOWNERS approval required to satisfy the hard approval gate.
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/creative-assignment.json (modified) matches
static/schemas/source/**; static/schemas/source/creative/sync-creatives-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/protocol/get-adcp-capabilities-response.json (modified) matchesstatic/schemas/source/**) and the current GitHub review decision is 'REVIEW_REQUIRED', not APPROVED. This is a hard gate enforced in code — Ladon cannot auto-approve until a human/CODEOWNERS approval is recorded, regardless of how clean the diff is.
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated schema paths require human/CODEOWNERS approval.
This PR modifies three files under static/schemas/source/**, which are under a hard, deterministic approval gate (gated_paths: true), and review_decision is REVIEW_REQUIRED (not APPROVED). Per decision rule row 2, this must escalate until a real human/CODEOWNERS approval is recorded.
The change itself is a coherent pre-GA (3.3 beta, pre mode) editorial/normative refinement: tracker-slot limits now apply only to formats declaring a tracker slot, with trackers matched by event. Schema↔docs coherence holds across the three source descriptions, the capabilities schema+doc, and the sync_creatives page; a correct minor changeset is included; a new test asserts the phrasing in all three surfaces; no structural schema change (no oneOf-audit impact).
Medium findings
- docs/reference/migration/3-2-to-3-3.mdx:591 — Two normative reference docs still assert tracker-slot enforcement unconditionally, overstating the requirement for no-slot formats (coherence gap; also docs/creative/tracker-execution-contracts.mdx:16).
Escalation reasons
- Gated paths touched without approval:
static/schemas/source/core/creative-assignment.json,static/schemas/source/creative/sync-creatives-request.json,static/schemas/source/protocol/get-adcp-capabilities-response.json— human/CODEOWNERS review required (review_decision is REVIEW_REQUIRED).
Medium findings
- docs/reference/migration/3-2-to-3-3.mdx:591 — Two normative reference docs still assert tracker-slot enforcement unconditionally
Why human review
- Gated schema paths modified (static/schemas/source/core/creative-assignment.json, static/schemas/source/creative/sync-creatives-request.json, static/schemas/source/protocol/get-adcp-capabilities-response.json) while review_decision is REVIEW_REQUIRED — human/CODEOWNERS approval required before merge.
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/creative-assignment.json (modified) matches
static/schemas/source/**; static/schemas/source/creative/sync-creatives-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/protocol/get-adcp-capabilities-response.json (modified) matchesstatic/schemas/source/**) and the current GitHub review decision is 'REVIEW_REQUIRED', not APPROVED. This is a hard gate enforced in code — Ladon cannot auto-approve until a human/CODEOWNERS approval is recorded, regardless of how clean the diff is.
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated-path approval gate not yet satisfied.
This PR modifies three files under static/schemas/source/**, which are under a hard, deterministic approval gate (gated_paths: true), while review_decision is REVIEW_REQUIRED (not APPROVED). Per decision rule row 2, the outcome must be escalate until a human/CODEOWNERS approval is recorded.
The diff itself is clean: the reviewer found no critical/high/medium findings. The change refines assignment-tracker slot-limit semantics consistently across creative-assignment.json, sync-creatives-request.json, get-adcp-capabilities-response.json, and the two corresponding docs pages, with a matching test. No schema↔docs drift, no new undiscriminated oneOf, no dist artifact edits, no hand-edited version, and the minor changeset is correctly scoped for a pre-GA 3.3 feature on the beta main line. This is a net-positive, well-scoped change — the only blocker is the procedural approval gate.
Escalation reasons
- Modifies gated paths under
static/schemas/source/**(creative-assignment.json, sync-creatives-request.json, get-adcp-capabilities-response.json) whilereview_decisionisREVIEW_REQUIRED— human/CODEOWNERS approval required to satisfy the hard approval gate.
Why human review
- Modifies gated paths under static/schemas/source/** (creative-assignment.json, sync-creatives-request.json, get-adcp-capabilities-response.json) while review_decision is REVIEW_REQUIRED — human/CODEOWNERS approval required to satisfy the hard approval gate.
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/creative-assignment.json (modified) matches
static/schemas/source/**; static/schemas/source/creative/sync-creatives-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/protocol/get-adcp-capabilities-response.json (modified) matchesstatic/schemas/source/**) and the current GitHub review decision is 'REVIEW_REQUIRED', not APPROVED. This is a hard gate enforced in code — Ladon cannot auto-approve until a human/CODEOWNERS approval is recorded, regardless of how clean the diff is.
…de and tracker contracts Addresses review on #8715: both pages stated slot enforcement unconditionally; they now say it applies where the format declares tracker slots. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — hard approval gate on gated schema paths not yet satisfied.
This PR modifies published protocol source under static/schemas/source/** (creative-assignment.json, sync-creatives-request.json, get-adcp-capabilities-response.json), which are deterministically gated paths. gated_paths: true and review_decision: REVIEW_REQUIRED (not APPROVED), so row 2 of the decision table forces escalate — Ladon cannot auto-approve until a human/CODEOWNERS approval is recorded, regardless of how clean the diff is.
The diff itself is clean: the reviewer reports no Critical/High/Medium findings. The delta on this pass is two documentation wording updates (tracker-execution-contracts.mdx, 3-2-to-3-3.mdx) adding the "tracker-slot limits apply only where the format declares at least one tracker slot" qualifier, consistent with schema descriptions, the capabilities doc, and sync_creatives.mdx. Event-matching rules match verbatim across surfaces; the minor changeset correctly refines the unreleased 3.3 assignment-trackers feature with no breaking wire change, and tests assert the new wording.
Schema↔docs coherence holds and no spec drift was found. The only reason for escalation is the unsatisfied gated-paths hard gate — a human/CODEOWNERS approval will lift it.
Escalation reasons
- Modifies gated paths under
static/schemas/source/**(creative-assignment.json, sync-creatives-request.json, get-adcp-capabilities-response.json) whilereview_decisionis REVIEW_REQUIRED — human/CODEOWNERS approval required to satisfy the hard approval gate.
Why human review
- Modifies gated paths under static/schemas/source/** (creative-assignment.json, sync-creatives-request.json, get-adcp-capabilities-response.json) while review_decision is REVIEW_REQUIRED — human/CODEOWNERS approval required to satisfy the hard approval gate.
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/creative-assignment.json (modified) matches
static/schemas/source/**; static/schemas/source/creative/sync-creatives-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/protocol/get-adcp-capabilities-response.json (modified) matchesstatic/schemas/source/**) and the current GitHub review decision is 'REVIEW_REQUIRED', not APPROVED. This is a hard gate enforced in code — Ladon cannot auto-approve until a human/CODEOWNERS approval is recorded, regardless of how clean the diff is.
|
Schema change approved by @bokelley (code owner): the description-only updates to the assignment |
Summary
This implements #8713, as approved by @bokelley.
The assignment-tracker rules said every assignment tracker must occupy one "compatible declared tracker slot", and that an assignment with no valid allocation MUST be rejected. They never said what happens when a format declares no tracker slot. That's true of canonical
image, whose tracking model fires trackers through macros. Read strictly, every assignment tracker on standard display formats had to be rejected, even by a seller that declarescreative.supports_assignment_trackers.The rules after this change
pixel_trackerslot, or a canonicalimpression_tracker,click_trackerorviewability_trackerslot. A format that declares none makes no slot-limit claim, so the seller doesn't reject an assignment tracker for lack of a slot. The existing fire-or-reject rule still applies: fire every accepted tracker at its event, or reject the assignment.impression_trackertakesimpression;click_trackertakesclick;viewability_trackertakes theviewable_*events andaudible_video_complete;pixel_trackerslot takes any event.replace: the same rules govern trackers areplacetransfers (fix(creative): replace transfers the replaced assignment's settings #8688), counted alongside the replacement creative's own trackers.The training agent already behaves this way (#8712), and the
assignment_replace_transfers_settingsstoryboard relies on it.Changes
docs/creative/task-reference/sync_creatives.mdx: the "Assignment trackers" slot paragraph is rewritten.creative/sync-creatives-request.json(theassignandassignments[]trackersfields) andcore/creative-assignment.jsontrackers: the slot sentence is aligned with the docs. These are description-only changes.supports_assignment_trackersdescription in the capabilities schema and inget_adcp_capabilities.mdxgains "where the format declares tracker slots".tests/assignment-trackers.test.cjs: a new contract test pins the rule in the schemas and docs.Testing
node --test tests/assignment-trackers.test.cjs tests/assignment-replace.test.cjs: 9 pass.node tests/schema-validation.test.cjs, plus JSON example validation onsync_creatives.mdx: pass.build:compliance --checkandlint:schema-links: clean.mcp-schema-projection: 36 pass, within the context budget.Closes #8713
🤖 Generated with Claude Code
Open workspace in Conductor