Skip to content

fix(creative): tracker-slot limits apply only where a format declares tracker slots - #8715

Merged
bokelley merged 2 commits into
mainfrom
bokelley/assignment-tracker-no-slot-claim
Nov 3, 2026
Merged

bokelley merged 2 commits into
mainfrom
bokelley/assignment-tracker-no-slot-claim

Conversation

@bokelley

@bokelley bokelley commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

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 declares creative.supports_assignment_trackers.

The rules after this change

  • When limits apply: only when the effective format declares at least one tracker slot. That means 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, 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.
  • Matching by event:
    • impression_tracker takes impression;
    • click_tracker takes click;
    • viewability_tracker takes the viewable_* events and audible_video_complete;
    • any other pixel_tracker slot takes any event.
  • replace: the same rules govern trackers a replace transfers (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_settings storyboard relies on it.

Changes

  • docs/creative/task-reference/sync_creatives.mdx: the "Assignment trackers" slot paragraph is rewritten.
  • creative/sync-creatives-request.json (the assign and assignments[] trackers fields) and core/creative-assignment.json trackers: the slot sentence is aligned with the docs. These are description-only changes.
  • The supports_assignment_trackers description in the capabilities schema and in get_adcp_capabilities.mdx gains "where the format declares tracker slots".
  • tests/assignment-trackers.test.cjs: a new contract test pins the rule in the schemas and docs.
  • Minor changeset. A seller that read the old text strictly would start accepting trackers it now rejects, so this ships in 3.3, not as a 3.2.x patch.

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 on sync_creatives.mdx: pass.
  • build:compliance --check and lint:schema-links: clean.
  • mcp-schema-projection: 36 pass, within the context budget.

Closes #8713

🤖 Generated with Claude Code


Open workspace in Conductor

…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>
@bokelley bokelley changed the title spec(creative): tracker-slot limits apply only where a format declares tracker slots fix(creative): tracker-slot limits apply only where a format declares tracker slots Nov 3, 2026

@aao-secretariat aao-secretariat Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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) while review_decision is REVIEW_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) matches static/schemas/source/**; static/schemas/source/protocol/get-adcp-capabilities-response.json (modified) matches static/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.

@aao-secretariat aao-secretariat Bot added the ladon/needs-human-review Ladon has escalated this PR for human review. label Nov 3, 2026

@aao-secretariat aao-secretariat Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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) matches static/schemas/source/**; static/schemas/source/protocol/get-adcp-capabilities-response.json (modified) matches static/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.

@aao-secretariat aao-secretariat Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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) while review_decision is 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) matches static/schemas/source/**; static/schemas/source/protocol/get-adcp-capabilities-response.json (modified) matches static/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>

@aao-secretariat aao-secretariat Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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) while review_decision is 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) matches static/schemas/source/**; static/schemas/source/protocol/get-adcp-capabilities-response.json (modified) matches static/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.

bokelley commented Nov 3, 2026

Copy link
Copy Markdown
Contributor Author

Schema change approved by @bokelley (code owner): the description-only updates to the assignment trackers fields in creative/sync-creatives-request.json and core/creative-assignment.json, and to supports_assignment_trackers in protocol/get-adcp-capabilities-response.json. They state that tracker-slot limits apply only where the format declares tracker slots, as proposed in #8713.

@bokelley
bokelley merged commit 16987de into main Nov 3, 2026
78 of 80 checks passed
@bokelley
bokelley deleted the bokelley/assignment-tracker-no-slot-claim branch November 3, 2026 12:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

creative ladon/needs-human-review Ladon has escalated this PR for human review. spec / protocol

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Assignment trackers: state what happens when the format declares no tracker slot

1 participant